python - Pandas 中的条件行迭代以创建新功能
问题描述
我有一个像这个例子的数据:
df11 = pd.DataFrame({'code': [33000000, 33230000, 33235600, 33235678, 17000000,17980000],
'Name': ['txt1','txt2','txt3','txt4','txt5','txt6'],
'level': [1,2,3,4,3,4]})
print(df11)
我的目标是遍历行(实际上是大约 100,000 行)并创建一个新功能,仅当 level==4 时才组合名称。所以最终输出应该是这样的:
code combined_names
33235678 txt1+txt2+txt3+txt4
17980000 txt5+txt6
8 位代码始终与级别相关联,级别 1 的代码始终为例如 33000000,然后为级别 2 添加另外 2 个数字,例如 33230000 等等。代码可能在数据框中的任何地方,不一定是连续的行,但总是具有这种逻辑。
我已经完成了以下操作,直到第一次出现条件 level=4(检查将 2nd level=4 替换为例如 9)为止都是正确的。但实际上有更多的条件级别= 4,我得到以下错误:
def combined_names(code):
code_list=[(code-code%10**x) for x in [6,4,2,0]]
#above I obtain the codes correspond to level 1 to level4 when level=4 is
#satisfied, by difference and modulo operator to 10**6,
#10**4,10**2,1. e.g For 33235678 as input we get:
#33000000,33230000,33235600 and 33235678
print(code_list)
name1=df11.query('code == @code_list[0]')['Name'].tolist()
name2=df11.query('code == @code_list[1]')['Name'].tolist()
name3=df11.query('code == @code_list[2]')['Name'].tolist()
name4=df11.query('code == @code_list[3]')['Name'].tolist()
name_list=name1+name2+name3+name4
print(name_list)
all_names= ' + '.join(name_list)
return all_names
combined_names(33235678)
conditions = [df11['level'] == 4]
choices = [combined_names( df11.query('level==4')['code'].item() )]
# problem: if there are more than one level4, then it does NOT iterate over.
# CHECK : https://stackoverflow.com/questions/16476924/how-to-iterate-over-rows-in-a-dataframe-in-pandas
df11['all_names'] = np.select(conditions, choices, default='NaN')
print(df11)
ValueError: can only convert an array of size 1 to a Python scalar
如何修改函数以捕获 df 中的所有所需条件?一般来说,执行此任务的更优化方法是什么?谢谢!
解决方案
创建一个临时列来检查级别是否为 4
df11['level_4'] = df11.loc[df11['level']==4,'Name']
向后填充以与前一行关联
df11 = df11.bfill()
在 level_4 上进行 Groupby 并使用字符串 cat进行聚合
M = df11.groupby('level_4').Name.agg(lambda x: x.str.cat(sep='+'))
M = M.rename('combined_names')
合并回原始数据框
(df11[['code','Name']]
.merge(M,left_on='Name',right_on='level_4')
.drop('Name',axis=1)
)
code combined_names
0 33235678 txt1+txt2+txt3+txt4
1 17980000 txt5+txt6
推荐阅读
- javascript - 如何使用 React 中的 Hooks 在带有汉堡菜单的标题中切换侧边栏组件
- liferay - Liferay portal-ext.properties 文件中启用的语言设置似乎不起作用
- python - Python:YYYY-MM-DDTHH:MM:SS 的 date.time strptime 格式?
- exception - 构建 Xamarin.iOS 时没有名为“NFCVASReaderSessionDelegate”的类型或协议
- upgrade - 超集从 0.38 升级到 1.0.1
- javafx - 将程序导出到 jar 文件时,JFXDatePicker 不起作用
- ansible - 如何在 AWX 中为库存脚本存储和检索秘密?
- node.js - 如何使用 http-proxy 和 Harmonon 将脚本标记注入 HTML 正文
- django - Django Rest-Framework-Simplejwt 不适用于 modheader
- python - 感知器神经网络不会学习特定范围内的值