Python 基于其他列id值创建新列-熊猫
如何基于其他列id值创建新列 数据如下所示Python 基于其他列id值创建新列-熊猫,python,pandas,dataset,Python,Pandas,Dataset,如何基于其他列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
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
我希望数据集看起来像这样
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
将
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
如果您有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')
对已经提供的优秀答案的补充:
(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