Python 使用列名和顶行作为列的熊猫融化
我有一个数据帧Python 使用列名和顶行作为列的熊猫融化,python,pandas,Python,Pandas,我有一个数据帧df,其中Col1、Col2和Col3是列名: Col1 Col2 Col3 a b B 2 3 C 10 6 上面带有值a,b的第一行是子类别,因此Col1对于第1行为空 我正试图获得以下信息: B Col2 a 2 B Col3 b 3 C Col2 a 10 C Col3 b 6 df = pd.Da
df
,其中Col1、Col2
和Col3
是列名:
Col1 Col2 Col3
a b
B 2 3
C 10 6
上面带有值a,b
的第一行是子类别,因此Col1
对于第1行为空
我正试图获得以下信息:
B Col2 a 2
B Col3 b 3
C Col2 a 10
C Col3 b 6
df = pd.DataFrame({'Col1': {0: np.nan, 1: 'B', 2: 'C'},
'Col2': {0: 'a', 1: '2', 2: '10'},
'Col3': {0: 'b', 1: '3', 2: '6'}})
melted = pd.melt(df, id_vars=['Col1'], value_vars=['Col3',
'Col2']).dropna().reset_index(drop=True)
subframe = pd.DataFrame({'Col2': ['a'], 'Col3': ['b']}).melt()
melted.merge(subframe, on='variable')
Out[1]:
Col1 variable value_x value_y
0 B Col3 3 b
1 C Col3 6 b
2 B Col2 2 a
3 C Col2 10 a
我不知道如何处理上述问题
编辑:
使用
stack
和join
df_final = (df.iloc[1:].set_index('Col1').stack().reset_index(0)
.join(df.iloc[0,1:].rename('1')).sort_values('Col1'))
Out[345]:
Col1 0 1
Col2 B 2 a
Col3 B 3 b
Col2 C 10 a
Col3 C 6 b
您可以尝试将NaN替换为空白(或任何希望命名列的字符串): 输出:
level_0 Col1 0
0 Col2 a B 2
1 Col2 a C 10
2 Col3 b B 3
3 Col3 b C 6
Col0 Col1 0
Col2 a B 2
Col2 a C 10
Col3 b B 3
Col3 b C 6
输出:
level_0 Col1 0
0 Col2 a B 2
1 Col2 a C 10
2 Col3 b B 3
3 Col3 b C 6
Col0 Col1 0
Col2 a B 2
Col2 a C 10
Col3 b B 3
Col3 b C 6
您可以执行以下操作:
B Col2 a 2
B Col3 b 3
C Col2 a 10
C Col3 b 6
df = pd.DataFrame({'Col1': {0: np.nan, 1: 'B', 2: 'C'},
'Col2': {0: 'a', 1: '2', 2: '10'},
'Col3': {0: 'b', 1: '3', 2: '6'}})
melted = pd.melt(df, id_vars=['Col1'], value_vars=['Col3',
'Col2']).dropna().reset_index(drop=True)
subframe = pd.DataFrame({'Col2': ['a'], 'Col3': ['b']}).melt()
melted.merge(subframe, on='variable')
Out[1]:
Col1 variable value_x value_y
0 B Col3 3 b
1 C Col3 6 b
2 B Col2 2 a
3 C Col2 10 a
然后,您可以根据需要重命名列您可以在数据框中创建一个新列(取决于哪些行为空),然后筛选出列都具有a
和b
的行:
(
df.melt("Col1")
.assign(temp=lambda x: np.where(x.Col1.isna(), x.value, np.nan))
.ffill()
.query("value != temp")
)
Col1 variable value temp
1 B Col2 2 a
2 C Col2 10 a
4 B Col3 3 b
5 C Col3 6 b
你能像df.to_dict()那样显示你的数据吗?为什么
a
和B
在同一行?这个“df.index=pd.MultiIndex.from_product([df.iloc[0,:])”对你有用吗?是的。我的版本是1.0.3