python pandas根据条件apply的问题
DataFrame中有3列,分别是区域、账号和业务类型,我希望增加一列“是否同装”,根据前面的账号和业务类型判断“是/否”。判断条件:列表中宽带与其他业务是否有同一账号,如果有,则为“是”,否则为“否”。如图效果。
代码要怎么写?请指教,谢谢。
import pandas as pd
df = pd.DataFrame({"区域": ["茂南", "茂南", "茂南", "茂南", "信宜", "茂南", "茂南", "高州", "高州"],
"账号": ["123456", "123455", "12315", "10326", "12583", "123456", "123456", "12305", "12369"],
"业务类型": ["宽带", "宽带", "宽带", "组网", "电视", "组网", "电视", "电视", "宽带"]})
print(df)
df['是否同装'] = df.apply(lambda x: '这里判断是否同装')
print(df)
已区域+账号为键,装维为值,做一个dict,然后看键的长度,大于1即为是,否则为否 说句老实话,没太读懂,我按照自己的理解写了几行代码```python
from collections import Counter
a = dict(Counter(df['账号']))
df['是否同装'] = df['账号'].apply(lambda x:"否" if a == 1 else "是")
```
我来一个完全用pandas处理的办法。
temp = df['账号'].value_counts().apply(lambda x:'是' if x >1 else '否')
temp.name = '是否同装'
new_df = pd.merge(df,temp,left_on='账号',right_index=True)
rsnodame 发表于 2020-12-14 15:43
我来一个完全用pandas处理的办法。
temp = df['账号'].value_counts().apply(la ...
对于temp的赋值,还有一个写法
temp = df['账号'].value_counts().mask(df['账号'].value_counts() > 1, '是').replace(1,'否')
如果数据多的话大概比apply要快 各位好,因为我上面说的判断条件是列表中宽带与其他业务是否有同一账号,如果有,则为“是”,否则为“否”。
所以我改了一下,如下代码也可以实现,请各位大佬拍砖。
# 新增[是否同装]列,根据账号是否重复,判断是否为同装业务
sheetTemp = sheetClosedLoop
listTemp = sheetTemp['宽带帐号'].tolist()
sheetClosedLoop['是否与宽带同装'] = sheetClosedLoop.apply(lambda x: '是' if x.宽带帐号 in listTemp and x.产品名称分类 != '宽带' else '否',
axis=1) cqwcns 发表于 2020-12-15 10:48
各位好,因为我上面说的判断条件是列表中宽带与其他业务是否有同一账号,如果有,则为“是”,否则为“否” ...
{:17_1062:} 哦大概明白你意思了,如果同一个账号的业务是组网和电视的话,就不属于同装,对吧 rsnodame 发表于 2020-12-15 11:33
哦大概明白你意思了,如果同一个账号的业务是组网和电视的话,就不属于同装,对吧
对头,就是这样{:301_997:}{:301_997:}{:301_997:} cqwcns 发表于 2020-12-16 08:57
对头,就是这样
虽然想到几个别的实现办法,不过感觉和你的办法也没啥特别差异{:301_1009:} rsnodame 发表于 2020-12-16 10:46
虽然想到几个别的实现办法,不过感觉和你的办法也没啥特别差异
谢谢大佬{:301_993:}
页:
[1]