Python 基于指向另一列的引用表更新Dataframe列时出现问题

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

我有一个数据框,我正试图根据我在外部参考表(目前是一个小的~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        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