更新熊猫数据框列第一次不起作用

时间:2018-07-16 10:19:44

标签: python pandas

我有一个与其他某些数据框相对应的数据框,然后我需要在一列中更新某些值,并发现我必须进行两次相同的更新。为了了解发生了什么,我将数据帧保存到磁盘并重新加载,然后进行更新,现在它可以在第一次使用。

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

我正在使用conda 4.5.0中的pandas 0.22.0

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行(名称和数字是伪造的):

    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
下面的

是上面代码的2个输出,表明某些替换成功,而某些替换没有成功。我运行了几次代码,总是下面的4行没有第一次更新。但是,如果数据或模式有问题,则第二次更新也将无法正常工作。

    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

1 个答案:

答案 0 :(得分:0)

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

11.化学纤维制造业
11.印刷和记录媒介复制业
...

第一次替换后,它们变为:

1.化学纤维制造业
1.印刷和记录媒介复制业
...

这就是为什么我必须替换两次。我将模式从'^(?\d?\.?\)?(其中:)?'更改为'^(?\d*\.?\)?(其中:)?',一切正常。

感谢所有回复和评论。