繁体   English   中英

Pandas 以列名和顶行为列熔化

[英]Pandas melt with column names and top row as column

我有一个 dataframe df ,其中Col1, Col2Col3是列名:

   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.to_dict()
Out[16]: 
{'Unnamed: 0': {0: nan, 1: 'B', 2: 'C'},
 'Col2': {0: 'a', 1: '2', 2: '10'},
 'Col3': {0: 'b', 1: '3', 2: '6'}}

使用stackjoin

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 替换为空白(或您希望命名列的任何字符串):

df.fillna('').set_index('Col1').T\
  .set_index('',append=True).stack().reset_index()

Output:

  level_0    Col1   0
0    Col2  a    B   2
1    Col2  a    C  10
2    Col3  b    B   3
3    Col3  b    C   6

df.fillna('Col0').set_index('Col1').T\
  .set_index('Col0',append=True).stack().reset_index(level=[1,2])

Output:

     Col0 Col1   0
Col2    a    B   2
Col2    a    C  10
Col3    b    B   3
Col3    b    C   6
df = pd.DataFrame.from_dict({'Col1': {0: np.nan, 1: 'B', 2: 'C'},
 'Col2': {0: 'a', 1: '2', 2: '10'},
 'Col3': {0: 'b', 1: '3', 2: '6'}})

# set index as a multi-index from the first row
df.index = pd.MultiIndex.from_product([df.iloc[0,:]])

# get rid of the empty row and reset the index
df = df.iloc[1:,:].reset_index()

answer = pd.melt(df, id_vars=['Col1',0], value_vars=['Col2','Col3'],value_name='vals')
answer[['Col1','variable',0,'vals']]
    
  Col1 variable  0 vals
0    B     Col2  a    2
1    C     Col2  b   10
2    B     Col3  a    3
3    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

然后您可以根据需要重命名列

您可以熔化dataframe,根据哪些行是 null 创建一个新列,然后过滤掉列同时具有ab的行:

(
    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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM