我有這樣的東西:
df =
col1 col2 col3
0 B C A
1 E D G
2 NaN F B
編輯:我需要把它轉換成這樣:
result =
名稱位置
0 B col1,col2
1 C col1
2 A col1
3 E col2
4 D col2
5 G col2
6 F col3
基本上得到一個 "位置",告訴我一個 "名字 "在哪一列。謝謝你的幫助。
uj5u.com熱心網友回復:
試試melt和dropna:
>>> df.melt(var_name='location').dropna()。 groupby('value', sort=False, as_index=False).agg(', '.join)
值的位置
0 B col1, col3
1 E col1
2 C col2
3 D col2
4 F col2
5 A col3
6 G col3
>>>
還有groupby和agg。
uj5u.com熱心網友回復:
嘗試使用melt來轉換columns到rows。并給rows一個column的名字。
然后dropna來洗掉rows中的NaN值。
df = df.melt(var_name="location"/span>, value_name="Name"/span>).dropna()
uj5u.com熱心網友回復:
你可以使用pandas.melt和pandas.groupby.agg:
df = df.melt(var_name="location"/span>, value_name="Name"/span>).dropna()
new_df = df.groupby("Name", as_index=False).agg(", ".join)
print(new_df)
輸出:
Name location
0 A col3
1 B col1,col3
2 C col2
3 D col2
4 E col1
5 F col2
6 G col3
uj5u.com熱心網友回復:
或者用stack()替代:
new = df.stack().reset_index().drop('level_0', axis=1).dropna()
new.columns = ['name','location']
列印:
name location
0 col1 B
1 col2 C
2 col3 A
3 col1 E
4 col2 D
5 col3 G
6 col2 F
編輯:
為了得到你的更新輸出,你可以使用groupby和join():
new.groupby('location').agg({'name':lambda x: ', '.join(list(x))}).reset_index()
這樣你就可以:
location name
0 A col3
1 B col1, col3
2 C col2
3 D col2
4 E col1
5 F col2
6 G col3
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/332590.html
標籤:
下一篇:翩翩起舞。重繪后我的資料顯示
