【问题标题】:how to reshape/ explode pandas dataframe?如何重塑/爆炸熊猫数据框?
【发布时间】:2021-05-27 13:10:12
【问题描述】:

我有这个数据框,其中包含每个 key*id 的行,我想将其分解为 id,key1,key2 并删除重复的行并保留 data_field ,我正在使用 python2.7 但我很高兴有一个解决方案适用于 python2.7 和 python3.7

我拥有的数据框:

import  pandas as pd
d = {'id': [111, 222, 222, 333, 333], 'key': ['key1', 'key2','key1','key2','key1'], 'value':[1,1,2,3,3],'data_field':['dummy1','dummy1','dummy2','dummy3','dummy2']}
df = pd.DataFrame(data=d)
print df[['id','key','value','data_field']].to_string(index=False)

        id   key  value data_field
         111  key1      1     dummy1
         222  key2      1     dummy1
         222  key1      2     dummy2
         333  key2      3     dummy3
         333  key1      3     dummy2

我希望将其转换为的数据框:

d = {'id': [111, 222, 333], 'key1': [1, 2, 3],'key2':[pd.np.nan,1,3] , 'data_field': ['dummy1', 'dummy2', 'dummy3']}
df = pd.DataFrame(data=d)
print df[['id', 'key1', 'key2', 'data_field']].to_string(index=False)
          
    id  key1  key2 data_field
         111     1   NaN     dummy1
         222     2   1.0     dummy2
         333     3   3.0     dummy3

按照这里的建议尝试

df.pivot(index='id', columns='key', values='value').join(df.drop_duplicates('id')['data_field'])
and got  :
            key1  key2 data_field
id                        
111   1.0   NaN        NaN
222   2.0   1.0        NaN
333   3.0   3.0        NaN

data_field 没有保留,id 现在是索引而不是列

【问题讨论】:

  • 添加了关于问题的例外
  • data_field 是另一个字段,每个 id *key 都重复
  • 我希望 id 作为列而不是索引,并且应该保留 data_field

标签: python pandas python-2.7 dataframe


【解决方案1】:

DataFrame.pivotDataFrame.join 一起使用,仅在data_field 中使用id 中的第一个重复行:

df = (df.pivot(index='id', columns='key', values='value')
       .join(df.set_index('id')['data_field'].drop_duplicates())
       .reset_index())

print (df)
    id  key1  key2 data_field
0  111   1.0   NaN     dummy1
1  222   2.0   1.0     dummy2
2  333   3.0   3.0     dummy3

另一个想法是将data_field 的第一条数据添加到idkey 的新列中:

df = df.pivot_table(index='id',columns='key',values=['value','data_field'],aggfunc='first')
df.columns = df.columns.map('_'.join)
df = df.reset_index()

print (df)
    id data_field_key1 data_field_key2  value_key1  value_key2
0  111          dummy1             NaN         1.0         NaN
1  222          dummy2          dummy1         2.0         1.0
2  333          dummy2          dummy3         3.0         3.0

【讨论】:

    猜你喜欢
    • 2022-01-27
    • 2019-01-15
    • 2023-01-19
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多