如果我在数据框中有这些列:
a b
1 5
1 7
2 3
1,2 3
2 5
如何创建列c
,其中列b
使用列a
(字符串)的分组求和,保留现有数据帧。某些行可以属于多个组。
a b c
1 5 15
1 7 15
2 3 11
1,2 3 26
2 5 11
是否有一个简单有效的解决方案,因为我拥有的数据帧非常大。
答案 0 :(得分:2)
您可以先将拆分列a
和join
拆分为原始DataFrame
:
print (df.a.str.split(',', expand=True)
.stack()
.reset_index(level=1, drop=True)
.rename('a'))
0 1
1 1
2 2
3 1
3 2
4 2
Name: a, dtype: object
df1 = df.drop('a', axis=1)
.join(df.a.str.split(',', expand=True)
.stack()
.reset_index(level=1, drop=True)
.rename('a'))
print (df1)
b a
0 5 1
1 7 1
2 3 2
3 3 1
3 3 2
4 5 2
然后sum
使用df1['c'] = df1.groupby(['a'])['b'].transform(sum)
#cast for aggreagation join working with strings
df1['a'] = df1.a.astype(str)
print (df1)
b a c
0 5 1 15
1 7 1 15
2 3 2 11
3 3 1 15
3 3 2 11
4 5 2 11
而不加重。
groupby
按transform
索引和汇总列的最后print (df1.groupby(level=0)
.agg({'a':','.join,'b':'first' ,'c':sum})
[['a','b','c']] )
a b c
0 1 5 15
1 1 7 15
2 2 3 11
3 1,2 3 26
4 2 5 11
:
// this is callback function
var file = document.createElement('input');
file.setAttribute('type', 'file');
// bind change event.
file.onchange = function () {
// see step second.
}
file.click();