首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新熊猫数据栏第一次不起作用

问更新熊猫数据栏第一次不起作用
EN

Stack Overflow用户
提问于 2018-07-16 10:19:44
回答 1查看 229关注 0票数 1

我有一个与其他数据文件连在一起的dataframe,然后我需要在一个列中更新一些值,并发现我必须执行两次相同的更新。为了了解发生了什么,我将数据保存到磁盘并重新加载,然后执行更新,现在它第一次工作。

是熊猫的虫子还是我弄错了?

我用的是conda 4.5.0中的熊猫0.22.0

代码语言:javascript
复制
import pandas as pd
sum_trade = pd.read_csv('somefile.csv')
df = pd.concat(
    [
        sum_trade.loc[sum_trade.mon == 201806 ].groupby(['trade'])['cnt'].sum(),
        sum_trade.loc[sum_trade.mon == 201706 ].groupby(['trade'])['cnt'].sum(),
        sum_trade.loc[sum_trade.mon > 201800].groupby(['trade'])['cnt'].sum(),
        sum_trade.loc[sum_trade.mon < 201800].groupby(['trade'])['cnt'].sum()
    ],
    axis = 1
).reset_index()

df.columns = ['trade_code', 'cnt201806', 'cnt201706', 'cnt20181-6', 'cnt20171-6']

# subsititude ["1.blabla", "(1)foofoo", "其中:barbar"] to ["blabla", "foofoo", "barbar"]
pattern = re.compile(r'^(?\d?\.?\)?(其中:)?')

df.to_csv('temp.csv')

# The following line would not success 
df.trade_code = df.trade_code.map(lambda x: pattern.sub('', x.strip()))
display(df[df.trade_code.map(lambda x: '1' in x)])
# do same update again seems worked
df.trade_code = df.trade_code.map(lambda x: pattern.sub('', x.strip()))
display(df[df.trade_code.map(lambda x: '1' in x)])


# if load data from file, first update will sucesses
df = pd.read_csv('temp.csv')
display(df[df.trade_code.map(lambda x: '1' in x)])
df.trade_code= df.trade_code.map(lambda x: pattern.sub('', x.strip()))
display(df[df.trade_code.map(lambda x: '1' in x)]) 

下面是一些somefile.csv的示例数据,大约有2500行,而连接的df大约有200行(名称和数字是伪造的):

代码语言:javascript
复制
    city        mon     trade                          cnt
0   达纳苏斯    201701  1.农业                         23458.0
1   达纳苏斯    201701  1.农副食品加工业             12345684.0
2   达纳苏斯    201701  1.房屋建筑业                      22109.0
3   达纳苏斯    201701  1.电信、广播电视和卫星传输服务       338.0
4   达纳苏斯    201701  1.电力、热力生产和供应业       133333.0

下面是上述代码的两个输出,这表明有些替换是成功的,而有些则没有成功。我运行了几次代码,它总是以下4行在第一次没有更新。但是,如果数据或模式有问题,第二次更新也不应该起作用。

代码语言:javascript
复制
    trade   cnt201806   cnt201706   cnt20181-6  cnt20171-6
33  1.化学纤维制造业   0.0     123451.0    0.0     5432185.0
34  1.印刷和记录媒介复制业    5678913.0   7890153.0   5555504.0   112233185.0
63  1.金属制品业     98765804.0  4321563.0   34567919.0  22222256.0
82  1.金属制品、机械和设备修理业     8765493.0   3214929.0   3322113331.0    556677155.0

====================================================================

    trade   cnt201806   cnt201706   cnt20181-6  cnt20171-6
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-18 15:44:14

我查了一下数据,发现一些交易是:

代码语言:javascript
复制
11.化学纤维制造业
11.印刷和记录媒介复制业
...

在第一次替代之后,它们变成:

代码语言:javascript
复制
1.化学纤维制造业
1.印刷和记录媒介复制业
...

这就是为什么我必须替换2次。我把我的模式从'^(?\d?\.?\)?(其中:)?'改为'^(?\d*\.?\)?(其中:)?',一切都好。

感谢所有的答复和评论。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51359567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档