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