我有一个如下所示的数据框
Index Batch Name
0 1 Jon
1
2 2 Adam
3
4 3 Voges
5
6 4 Jon
我想从此数据框中用批号组合创建另一个数据框
Batch Name/Batches
1 Jon(1,4)
2 Adam(2)
3 Voges(3)
4 Jon(1,4)
如果我要从现有DF创建一个新列表或orderdict,然后将其转换为另一个DF,或者可以即时完成,该怎么做。
更新: 在它们之间留有空格
答案 0 :(得分:4)
In [33]: df['Name/Batches'] = \
df['Name'] + '(' + \
df.groupby('Name')['Batch'].transform(lambda x: x.astype(str).str.cat(sep=',')) \
+ ')'
In [34]: df
Out[34]:
Batch Name Name/Batches
0 1 Jon Jon(1,4)
1 2 Adam Adam(2)
2 3 Voges Voges(3)
3 4 Jon Jon(1,4)
答案 1 :(得分:2)
这是使用groupby
+ transform
和自定义函数的一种方式:
def stringer(x):
return '('+', '.join(map(str, x))+')'
df['Name'] += df.groupby('Name')['Batch'].transform(stringer)
print(df)
Batch Name
0 1 Jon(1, 4)
1 2 Adam(2)
2 3 Voges(3)
3 4 Jon(1, 4)
更新空行的会计记录
在这种情况下,您可以使用numpy.where
:
import numpy as np
def stringer(x):
return '('+', '.join(map(str, map(int, x)))+')'
s = df.dropna(subset=['Name']).groupby('Name')['Batch'].apply(stringer)
df['Name/Batch'] = np.where(df['Name'].notnull(),
df['Name'] + df['Name'].map(s),
df['Name'])
print(df)
Index Batch Name Name/Batch
0 0 1.0 Jon Jon(1, 4)
1 1 NaN NaN NaN
2 2 2.0 Adam Adam(2)
3 3 NaN NaN NaN
4 4 3.0 Voges Voges(3)
5 5 NaN NaN NaN
6 6 4.0 Jon Jon(1, 4)