如何根据其他列ID值创建新列?
数据看起来像这样。
value id
551 54089
12 54089
99 54089
55 73516
123 73516
431 73516
742 74237
444 74237
234 74237
我希望数据集看起来像这样。
v1 v2 v3
54089 551 12 99
73516 55 123 431
74237 742 444 234
答案 0 :(得分:3)
将groupby
与unstack
一起使用:
df = df.groupby('id')['value'].apply(lambda x: pd.Series(x.tolist(),
index=['v1', 'v2', 'v3']))\
.unstack()
# or
df.groupby('id')['value'].apply(lambda x: pd.DataFrame(x.tolist(),
index=['v1', 'v2', 'v3']).T)
print(df)
v1 v2 v3
id
54089 551 12 99
73516 55 123 431
74237 742 444 234
答案 1 :(得分:1)
如果您拥有3个以上的值,则可以创建一个小助手,以适应数据框的大小。
import pandas as pd
import numpy as np
#Dummy Dataframe
np.random.seed(2016)
df = pd.DataFrame({'id':
[54089, 54089, 54089, 73516, 73516, 73516, 73516, 74237, 74237,74237],
'value': np.random.randint(1, 100, 10)})
#Create group
grp = df.groupby('id')
#Create helper column
df['ID_Count'] = grp['value'].cumcount() + 1
#Pivot dataframe using helper column and add 'value' column to pivoted output.
df_out = df.pivot('id','ID_Count','value').add_prefix('v')
答案 2 :(得分:0)
除了已经提供的出色答案之外:
(df.astype({'value':str})
.groupby('id')
.agg(','.join)
.value.str.split(',',expand=True)
.set_axis(['v1','v2','v3'],axis=1)
.astype(int)
)
v1 v2 v3
id
54089 551 12 99
73516 55 123 431
74237 742 444 234