gpt4 book ai didi

python - 如何根据多个条件按变量组有效更新数据帧值?

转载 作者:行者123 更新时间:2023-11-28 22:19:24 25 4
gpt4 key购买 nike

我有一个数据框如下:

输入自由度:

name  name_group  value
foo1 a 2
foo2 a 2
foo3 a 2
foo4 a 2
bar1 b
bar2 b
bar3 b
buzz1 c 6
buzz2 c 6
buzz3 c 6
buzz4 c 6
buzz5 c 6

每个 name_group 中的每一行都具有相同的“值”,因此在这种情况下,name_group“a”中的每个名称都具有相同的“值”,name_group“b”中的每个名称都具有相同的“值”,等等。

我想创建一个新列“new_vals”,它等于最小值(“name_group”、“value”列中的行数)。如果任何“name_group”的“value”列中存在缺失值,它应该只使用该“name_group”中的行数。对于我的示例数据框,所需的输出是:

输出方向:

name  name_group  value   new_vals
foo1 a 2 2
foo2 a 2 2
foo3 a 2 2
foo4 a 2 2
bar1 b 3
bar2 b 3
bar3 b 3
buzz1 c 6 5
buzz2 c 6 5
buzz3 c 6 5
buzz4 c 6 5
buzz5 c 6 5

目前,我实现此目的的方法是遍历“name_group”列中的每个唯一值,找到该 name_group 中的行数,将其与“value”列中的值进行比较,然后设置值“new_val”列基于两者之间的最小值。每个“name_group”的结果都连接到另一个数据帧,直到我得到最终输出。

虽然此方法有效,但我觉得好像必须有一种更有效的方法来执行此操作,而不是将子集作为起始数据帧,分别处理每个“name_group”,然后将所有内容重新组合在一起。有没有人有更 pythonic/有效的方法来重现此功能?

这是反射(reflect)我当前流程的一些代码:

output_df = pd.DataFrame()
for name_group in input_df['name_group'].unique():
# process the data one name group at a time
temp_df = input_df.loc[input_df['name_group'] == name_group]

max_val = temp_df['value'].max()
name_group_cnt = temp_df.shape[0]

# if the "value" column is empty, set new_val equal to the number of
# rows in that name_group
if max_val == '':
new_val = name_group_cnt
else:
new_val = min(max_val, name_group_cnt)

temp_df['new_val'] = new_val
output_df = pd.concat([output_df, temp_df])

最佳答案

我将使用transformnp.where

s=df.groupby('name_group').name_group.transform('count')
df['New']=np.where(s>df.value,df.value,s)
df
Out[13]:
name name_group value New
0 foo1 a 2.0 2.0
1 foo2 a 2.0 2.0
2 foo3 a 2.0 2.0
3 foo4 a 2.0 2.0
4 bar1 b NaN 3.0
5 bar2 b NaN 3.0
6 bar3 b NaN 3.0
7 buzz1 c 6.0 5.0
8 buzz2 c 6.0 5.0
9 buzz3 c 6.0 5.0
10 buzz4 c 6.0 5.0
11 buzz5 c 6.0 5.0

关于python - 如何根据多个条件按变量组有效更新数据帧值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49786024/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com