Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫根据列值将数据帧除以另一个_Python_Pandas_Dataframe - Fatal编程技术网

Python 熊猫根据列值将数据帧除以另一个

Python 熊猫根据列值将数据帧除以另一个,python,pandas,dataframe,Python,Pandas,Dataframe,我想根据列值将一个数据帧除以另一个数据帧。 例如,假设我有: >>> df = pd.DataFrame({'NAME': [ 'CA', 'CA', 'CA', 'AZ', 'AZ', 'AZ', 'TX', 'TX', 'TX'], 'NUM':[1, 2, 3, 1, 2, 3, 1, 2, 3], 'VALUE': [10, 20, 30, 40, 50, 60, 70, 80, 90]}) >>> df NAME NUM VALUE 0

我想根据列值将一个数据帧除以另一个数据帧。 例如,假设我有:

>>> df = pd.DataFrame({'NAME': [ 'CA', 'CA', 'CA', 'AZ', 'AZ', 'AZ', 'TX', 'TX', 'TX'], 'NUM':[1, 2, 3, 1, 2, 3, 1, 2, 3], 'VALUE': [10, 20, 30, 40, 50, 60, 70, 80, 90]})
>>> df
  NAME  NUM  VALUE
0   CA    1     10
1   CA    2     20
2   CA    3     30
3   AZ    1     40
4   AZ    2     50
5   AZ    3     60
6   TX    1     70
7   TX    2     80
8   TX    3     90
>>> states = pd.DataFrame({'NAME': ['CA', "AZ", "TX"], 'DIVISOR': [10, 5, 1]})
>>> states
  NAME  DIVISOR
0   CA       10
1   AZ        5
2   TX        1
对于每个状态和NUM,我想将df中的VALUE列除以相应状态的除数列

这将导致

>>> result = pd.DataFrame({'NAME': [ 'CA', 'CA', 'CA', 'AZ', 'AZ', 'AZ', 'TX', 'TX', 'TX'], 'NUM':[1, 2, 3, 1, 2, 3, 1, 2, 3], 'VALUE': [1, 2, 3, 8, 10, 12, 70, 80, 90]})
>>> result
  NAME  NUM  VALUE
0   CA    1      1
1   CA    2      2
2   CA    3      3
3   AZ    1      8
4   AZ    2     10
5   AZ    3     12
6   TX    1     70
7   TX    2     80
8   TX    3     90

让我们做
map

df['NEW VALUE'] = df['VALUE'].div(df['NAME'].map(states.set_index('NAME')['DIVISOR']))
df
Out[129]: 
  NAME  NUM  VALUE  NEW VALUE
0   CA    1     10        1.0
1   CA    2     20        2.0
2   CA    3     30        3.0
3   AZ    1     40        8.0
4   AZ    2     50       10.0
5   AZ    3     60       12.0
6   TX    1     70       70.0
7   TX    2     80       80.0
8   TX    3     90       90.0

我觉得必须有一个更雄辩的方式来完成你所寻找的,但这是我通常采取的失败

myresult = df.copy()
for i in range(len(df['NAME'])):
    for j in range(len(states['NAME'])):
        if  df['NAME'][i] == states['NAME'][j]:
            myresult['VALUE'][i] = df['VALUE'][i]/states['DIVISOR'][j]
    
myresult.head()

Out[10]>>
  NAME  NUM VALUE
0   CA  1   1
1   CA  2   2
2   CA  3   3
3   AZ  1   8
4   AZ  2   10

这是一种非常野蛮的方法。首先循环遍历数据框
df
中的每个值,然后循环遍历数据框
状态中的每个元素。然后,对于每个比较,查看
名称
列是否匹配。如果是,则执行
/
除数


如果使用
.copy()
方法,您将得到一个警告,您也可以使用merge

result = df.merge(states,on=['NAME'])
result['NEW VALUE'] = result.VALUE/result.DIVISOR
print(result)

NAME  NUM  VALUE  NEW VALUE  DIVISOR
0   CA    1     10        1.0       10
1   CA    2     20        2.0       10
2   CA    3     30        3.0       10
3   AZ    1     40        8.0        5
4   AZ    2     50       10.0        5
5   AZ    3     60       12.0        5
6   TX    1     70       70.0        1
7   TX    2     80       80.0        1
8   TX    3     90       90.0        1

实际的方法是将字段名上的两个数据帧连接起来,然后您可以将这两列彼此分开。