我有这个数据框,每个 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 现在是索引而不是列
答案 0 :(得分:0)
将 DataFrame.pivot
与 DataFrame.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
到每个 id
和 key
的新列的第一个数据的另一个想法:
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