我有一个与其他某些数据框相对应的数据框,然后我需要在一列中更新某些值,并发现我必须进行两次相同的更新。为了了解发生了什么,我将数据帧保存到磁盘并重新加载,然后进行更新,现在它可以在第一次使用。
是熊猫的虫子还是我弄错了?
我正在使用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
答案 0 :(得分:0)
我检查了数据,发现一些交易是:
11.化学纤维制造业
11.印刷和记录媒介复制业
...
第一次替换后,它们变为:
1.化学纤维制造业
1.印刷和记录媒介复制业
...
这就是为什么我必须替换两次。我将模式从'^(?\d?\.?\)?(其中:)?'
更改为'^(?\d*\.?\)?(其中:)?'
,一切正常。
感谢所有回复和评论。