Python 基于指向另一列的引用表更新Dataframe列时出现问题
我有一个数据框,我正试图根据我在外部参考表(目前是一个小的~20个条目的csv)中的信息来更新它,我很难弄清楚如何让它工作 数据帧如下所示:Python 基于指向另一列的引用表更新Dataframe列时出现问题,python,pandas,csv,dictionary,dataframe,Python,Pandas,Csv,Dictionary,Dataframe,我有一个数据框,我正试图根据我在外部参考表(目前是一个小的~20个条目的csv)中的信息来更新它,我很难弄清楚如何让它工作 数据帧如下所示: id company value1 value2 1 foo 10.00 0.00 2 bar 10.00 0.00 3 lorem 15.00 0.00 4 ipsum 10.00 0.00 5 foo
id company value1 value2
1 foo 10.00 0.00
2 bar 10.00 0.00
3 lorem 15.00 0.00
4 ipsum 10.00 0.00
5 foo 50.00 0.00
6 lorem 40.00 0.00
7 foo 0.00 0.00
df['value2'] = df['value1'] * (df["company"].map(vd)/100)
参考表csv包含value1乘以value2得到value2的百分比,如下所示(它们最初是小数,但vd=pd.read_csv(“$name.csv”,index_col=0)。to_dict()导致浮点问题,因此我改为更改了参考表):
我希望输出如下所示:
id company value1 value2
1 foo 10.00 1.50
2 bar 10.00 5.00
3 lorem 15.00 15.00
4 ipsum 10.00 4.00
5 foo 50.00 7.50
6 lorem 40.00 40.00
7 foo 0.00 0.00
目前,我正在将引用表导入字典(作为整数),但是当我将其与数据帧匹配时,结果(value2)返回为NaN。我认为我的问题可能与匹配的代码有关,目前看起来如下:
id company value1 value2
1 foo 10.00 0.00
2 bar 10.00 0.00
3 lorem 15.00 0.00
4 ipsum 10.00 0.00
5 foo 50.00 0.00
6 lorem 40.00 0.00
7 foo 0.00 0.00
df['value2'] = df['value1'] * (df["company"].map(vd)/100)
我走对了吗?这是我第一次使用熊猫,所以我可能遗漏了一些明显的东西
谢谢大家!
编辑:不小心忘记混淆一个变量。“vd”只是字典导入后的名称。
map
是目前为止最快的方法。但这里有几个备选方案,以及它们的性能
设置
首先,df
-
df
id company value1 value2
0 1 foo 10.0 0.0
1 2 bar 10.0 0.0
2 3 lorem 15.0 0.0
3 4 ipsum 10.0 0.0
4 5 foo 50.0 0.0
5 6 lorem 40.0 0.0
接下来,vd
-
或者
选项1
map
选项2
更换
选项3
合并
性能
df = pd.concat([df] * 10000, ignore_index=True)
map
显然是这里的赢家。我想我以前误解了。你能告诉我什么是vd
吗?如果它是一个数据帧,而不是vd
,你可以使用vd.set_index('company')['percentage']
,但你需要展示你是如何构建这些数据帧的。不,你似乎以前就做对了。摆脱字典,改为使用vd=pd.read_csv(“$name.csv”,index_col=0,squeak=True)修复了引用表中的字典的问题,我不关心引用表中没有的字典(因为它们会立即被删除)。现在我只需要添加边界检查(因为前面一节中的任何负数都需要为0而不是负数),然后就可以开始了。非常感谢。希望您也仔细阅读我的答案;-)@ZuR4ruukmT0YPwgs立即尝试…;-)此外,如果它回答了您的问题,您可以通过单击答案旁边的灰色复选框将其切换为绿色来接受它。请参阅我上面的评论^
vd
company
foo 15
bar 50
ipsum 40
Name: percentage, dtype: int64
df.value2 = df.value1 * df.company.map(vd).fillna(100).div(100)
df
id company value1 value2
0 1 foo 10.0 1.5
1 2 bar 10.0 5.0
2 3 lorem 15.0 15.0
3 4 ipsum 10.0 4.0
4 5 foo 50.0 7.5
5 6 lorem 40.0 40.0
v = pd.to_numeric(df.company.replace(vd), errors='coerce')
df.value2 = df.value1 * v.fillna(100) / 100
df
id company value1 value2
0 1 foo 10.0 1.5
1 2 bar 10.0 5.0
2 3 lorem 15.0 15.0
3 4 ipsum 10.0 4.0
4 5 foo 50.0 7.5
5 6 lorem 40.0 40.0
df = df.merge(
(vd / 100).to_frame(),
left_on='company',
right_index=True,
how='left'
).fillna(1)
df.value2 = df.value1 * df.percentage
del df['percentage']
df
id company value1 value2
0 1 foo 10.0 1.5
1 2 bar 10.0 5.0
2 3 lorem 15.0 15.0
3 4 ipsum 10.0 4.0
4 5 foo 50.0 7.5
5 6 lorem 40.0 40.0
df = pd.concat([df] * 10000, ignore_index=True)
%timeit df.value1 * df.company.map(vd).fillna(100).div(100)
100 loops, best of 3: 6.07 ms per loop
%timeit df.value1 * pd.to_numeric(df.company.replace(vd), errors='coerce').fillna(100) / 100
10 loops, best of 3: 65.6 ms per loop
%%timeit
df2 = df.merge((vd / 100).to_frame(), left_on='company', right_index=True, how='left').fillna(1)
df2.value2 = df2.value1 * df2.percentage
del df2['percentage']
100 loops, best of 3: 13.1 ms per loop