Pandas 用数组更新列
Pandas update column with array
所以,我正在学习 pandas,但我遇到了这个问题。
假设我有一个像这样的数据框:
A B C
1 x NaN
2 y NaN
3 x NaN
4 x NaN
5 y NaN
我正在尝试创建这个:
A B C
1 x [1,3,4]
2 y [2,5]
3 x [1,3,4]
4 x [1,3,4]
5 y [2,5]
基于 B 的相似性。
我这样做了:
teste = df.groupby(['B'])
for name,group in teste:
df.loc[df['B'] == name[0],'C'] = group['A'].tolist()
我明白了。就像C列是基于A列。
A B C
1 x 1
2 y 2
3 x 3
4 x 4
5 y 5
任何人都可以向我解释为什么会发生这种情况以及按照我想要的方式执行此操作的解决方案吗?
谢谢:)
您可以先根据列 B 进行聚合,然后在 B
:
上与原始 df 连接回来
df
# A B
#0 1 x
#1 2 y
#2 3 x
#3 4 x
#4 5 y
df.groupby('B').A.apply(list).rename('C').reset_index().merge(df)
# B C A
#0 x [1, 3, 4] 1
#1 x [1, 3, 4] 3
#2 x [1, 3, 4] 4
#3 y [2, 5] 2
#4 y [2, 5] 5
test = df.groupby('B')['A'].apply(list)
您可以使用 transform
创建列表。
In [324]: df['C'] = df.groupby('B')['A'].transform(lambda x: [x.values])
In [325]: df
Out[325]:
A B C
0 1 x [1, 3, 4]
1 2 y [2, 5]
2 3 x [1, 3, 4]
3 4 x [1, 3, 4]
4 5 y [2, 5]
求和创意!
创建 A
个单值列表。然后使用 sum
.
进行转换
df.assign(
C=pd.Series(
df.A.values[:, None].tolist(), df.index
).groupby(df.B).transform('sum')
)
A B C
0 1 x [1, 3, 4]
1 2 y [2, 5]
2 3 x [1, 3, 4]
3 4 x [1, 3, 4]
4 5 y [2, 5]
所以,我正在学习 pandas,但我遇到了这个问题。
假设我有一个像这样的数据框:
A B C
1 x NaN
2 y NaN
3 x NaN
4 x NaN
5 y NaN
我正在尝试创建这个:
A B C
1 x [1,3,4]
2 y [2,5]
3 x [1,3,4]
4 x [1,3,4]
5 y [2,5]
基于 B 的相似性。
我这样做了:
teste = df.groupby(['B'])
for name,group in teste:
df.loc[df['B'] == name[0],'C'] = group['A'].tolist()
我明白了。就像C列是基于A列。
A B C
1 x 1
2 y 2
3 x 3
4 x 4
5 y 5
任何人都可以向我解释为什么会发生这种情况以及按照我想要的方式执行此操作的解决方案吗? 谢谢:)
您可以先根据列 B 进行聚合,然后在 B
:
df
# A B
#0 1 x
#1 2 y
#2 3 x
#3 4 x
#4 5 y
df.groupby('B').A.apply(list).rename('C').reset_index().merge(df)
# B C A
#0 x [1, 3, 4] 1
#1 x [1, 3, 4] 3
#2 x [1, 3, 4] 4
#3 y [2, 5] 2
#4 y [2, 5] 5
test = df.groupby('B')['A'].apply(list)
您可以使用 transform
创建列表。
In [324]: df['C'] = df.groupby('B')['A'].transform(lambda x: [x.values])
In [325]: df
Out[325]:
A B C
0 1 x [1, 3, 4]
1 2 y [2, 5]
2 3 x [1, 3, 4]
3 4 x [1, 3, 4]
4 5 y [2, 5]
求和创意!
创建 A
个单值列表。然后使用 sum
.
df.assign(
C=pd.Series(
df.A.values[:, None].tolist(), df.index
).groupby(df.B).transform('sum')
)
A B C
0 1 x [1, 3, 4]
1 2 y [2, 5]
2 3 x [1, 3, 4]
3 4 x [1, 3, 4]
4 5 y [2, 5]