私は、特定の年のデータを取り込み、データフレームを返す関数を持っています。例えば個々のパンダのデータフレームをフラット化して新しいフレームを作成する方法を教えてください。
:
DF
year fruit license grade
1946 apple XYZ 1
1946 orange XYZ 1
1946 apple PQR 3
1946 orange PQR 1
1946 grape XYZ 2
1946 grape PQR 1
..
2014 grape LMN 1
注: 1)特定のライセンスの値は例えば(のみ特定の年のために存在し、一度だけ、特定の果物のためになるXYZだけのために。 1946年、リンゴ、オレンジ、ブドウのために一度だけ)。 2)グレード値はカテゴリに分類されます。
私は以下の機能が目的の目標である、 を達成するのに非常に効率的ではないことを認識していますが、これは私が現在取り組んでいることです。
df_1946=func(df,1946)
df_1946.head()
Source Target Weight
Apple Orange 0.6
Apple Grape 0.3
Orange Grape 0.7
が、私は単一の行に上記を平らにしたい:
def func(df, year):
#1. Filter out only the data for the year needed
df_year=df[df['year']==year]
'''
2. Transform DataFrame to the form:
XYZ PQR .. LMN
apple 1 3 1
orange 1 1 3
grape 2 1 1
Note that 'LMN' is just used for representation purposes.
It won't logically appear here because it can only appear for the year 2014.
'''
df_year = df_year.pivot(index='fruit',columns='license',values='grade')
#3. Remove all fruits that have ANY NaN values
df_year=df_year.dropna(axis=1, how="any")
#4. Some additional filtering
#5. Function to calculate similarity between fruits
def similarity_score(fruit1, fruit2):
agreements=np.sum( ((fruit1 == 1) & (fruit2 == 1)) | \
( (fruit1 == 3) & (fruit2 == 3)))
disagreements=np.sum( ((fruit1 == 1) & (fruit2 == 3)) |\
( (fruit1 == 3) & (fruit2 == 1)))
return (((agreements-disagreements) /float(len(fruit1))) +1)/2)
#6. Create Network dataframe
network_df=pd.DataFrame(columns=['Source','Target','Weight'])
for i,c in enumerate(combinations(df_year,2)):
c1=df[[c[0]]].values.tolist()
c2=df[[c[1]]].values.tolist()
c1=[item for sublist in c1 for item in sublist]
c2=[item for sublist in c2 for item in sublist]
network_df.loc[i] = [c[0],c[1],similarity_score(c1,c2)]
return network_df
以上実行すると、与え上記の3つの列を持っていません
(Apple,Orange) (Apple,Grape) (Orange,Grape)
1946 0.6 0.3 0.7
ますが、実際には周り5000カラム。
df_all_years
(Apple,Orange) (Apple,Grape) (Orange,Grape)
1946 0.6 0.3 0.7
1947 0.7 0.25 0.8
..
2015 0.75 0.3 0.65
これを行うための最善の方法は何ですか:
結局、私のような何かを得るために変換データフレームの列をスタックしたいですか?
'(アップル、オレンジ)' - それは文字列またはタプルですか? – MaxU
タプル。特定のセルがどのような組み合わせを表しているかを示す方法がある限り、好きなものを使うことができます。 – Melsauce