吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1567|回复: 13
收起左侧

[求助] python pandas多列apply的问题。

[复制链接]
cqwcns 发表于 2020-12-6 00:08
以下代码apply部分实现的是新增一列,并根据['商户']的内容来对新列进行赋值(判断商户包含的区域名称)。
但由于有时数据并不完整,我希望改为通过'范围'、'地址'、'商户'三列来判断区域(而不是仅判断“商户”一列),代码要怎么改?请指教,谢谢。

[Python] 纯文本查看 复制代码
import numpy as np
import pandas as pd
regions = ['高州', '茂南', '信宜', '化州']

symbol = ['BABA', 'JD', 'APPLE', 'MS', 'GS', 'WMT']
data = {'行业': ['电商', '电商', '科技', '金融', '金融', '零售'],
        '价格': [176.92, 25.95, 172.97, 41.79, 196.00, 99.55],
        '交易量': [16175610, 27113291, 18913154, 10132145, 2626634, 8086946],
        '雇员': [101550, 175336, 100000, 60348, 36600, 2200000],
        '范围': ['高州及镇隆周边', '公馆', '高山周边', '城区范围', '', '时代新城'],
        '地址': ['高州市公园路1号', '茂南大道东', '', '花园广场3楼', '', '信宜市世贸中心'],
        '商户': ['高州市金山建文电讯手机经营部W', '茂名市茂南区大众电脑维修部', '茂名市通汇电信器材有限公司(茂名通汇直营)W',
               '信宜市镇隆镇亚芳手机店W', '中移铁通有限公司化州运营中心W', '信宜市盛汇通讯器材商行W']}
df = pd.DataFrame(data, index=symbol)
df.name = '美股'
df.index.name = '代号'

df['区域'] = df['商户'].apply(lambda x: ''.join([y if x.find(y) >= 0 else '' for y in regions]))

print(df)


微信图片_20201206000255.png

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

choolyee 发表于 2020-12-6 01:06
本帖最后由 choolyee 于 2020-12-6 01:27 编辑

[Python] 纯文本查看 复制代码
import numpy as np
import pandas as pd

regions = ['高州', '茂南', '信宜', '化州']

symbol = ['BABA', 'JD', 'APPLE', 'MS', 'GS', 'WMT']
data = {'行业': ['电商', '电商', '科技', '金融', '金融', '零售'],
        '价格': [176.92, 25.95, 172.97, 41.79, 196.00, 99.55],
        '交易量': [16175610, 27113291, 18913154, 10132145, 2626634, 8086946],
        '雇员': [101550, 175336, 100000, 60348, 36600, 2200000],
        '范围': ['高州及镇隆周边', '公馆', '高山周边', '城区范围', '', '时代新城'],
        '地址': ['高州市公园路1号', '茂南大道东', '', '花园广场3楼', '', '信宜市世贸中心'],
        '商户': ['高州市金山建文电讯手机经营部W', '茂名市茂南区大众电脑维修部', '茂名市通汇电信器材有限公司(茂名通汇直营)W',
               '信宜市镇隆镇亚芳手机店W', '中移铁通有限公司化州运营中心W', '信宜市盛汇通讯器材商行W']}
df = pd.DataFrame(data, index=symbol)
df.name = '美股'
df.index.name = '代号'
df['临时'] = df['范围']+df['地址']+df['商户']
df['区域'] = df['临时'].apply(lambda x: ''.join([y if x.find(y) >= 0 else '' for y in regions]))
df = df.drop(columns=['临时'])
print(df)

曲线救国也是可以的嘛
bing90740 发表于 2020-12-6 07:55
chunfengyidu 发表于 2020-12-6 08:07
wanderrr 发表于 2020-12-6 09:17
choolyee 发表于 2020-12-6 01:06
[Python] 纯文本查看 复制代码
import numpy as np
import pandas as pd

[/quote]

大佬,能解释下这段代码
[mw_shl_code=python,true]for y in regions:
    if x.find(y) >=0:
        return y
    else:
        return ''

为什么能写成这样 y if x.find(y) >= 0 else '' for y in regions 吗?
或者哪里能搜到相关的知识点。
谢谢
jixiangyh 发表于 2020-12-6 09:51
学习了,感谢分享
 楼主| cqwcns 发表于 2020-12-6 09:58
choolyee 发表于 2020-12-6 01:06
[mw_shl_code=python,true]import numpy as np
import pandas as pd

有点曲,但可以接受。

但我发现一个问题,如果'范围'、'地址'、'商户'三列均不为空时,这样是可以的。
但如果其中有一列为空,则拼接出来的结果也是空的,这个怎么解决?
神枪泡泡丶 发表于 2020-12-6 11:39
cqwcns 发表于 2020-12-6 09:58
有点曲,但可以接受。

但我发现一个问题,如果'范围'、'地址'、'商户'三列均不为空时,这样是可以的。 ...

我测试的时候完全没发现你说的这个问题。。 至于APPLE那个为什么为空,你的范围 地址 商户里面 都没有对应的region的关键词。。这能不为空吗
 楼主| cqwcns 发表于 2020-12-6 11:44
神枪泡泡丶 发表于 2020-12-6 11:39
我测试的时候完全没发现你说的这个问题。。 至于APPLE那个为什么为空,你的范围 地址 商户里面 都没有对 ...

解决了,加了一个.map(str)就可以了

['装维组/用户班'].map(str)
ol416 发表于 2020-12-6 12:18
本帖最后由 ol416 于 2020-12-6 12:23 编辑

@wanderrr

[Python] 纯文本查看 复制代码
status = True
0 if status else 1
你运行之后就知道了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 09:35

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表