Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.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 两个不同索引的数据帧的pandas计算_Python_Pandas_Dataframe - Fatal编程技术网

Python 两个不同索引的数据帧的pandas计算

Python 两个不同索引的数据帧的pandas计算,python,pandas,dataframe,Python,Pandas,Dataframe,有两个索引不同但列匹配的数据帧,如何计算它们之间的差异 例如,与 df1 = pd.DataFrame({ 'a': (188, 750, 1330, 1385, 188, 750, 1330, 1385), 'b': (51.12, 51.45, 74.49, 29.21, 39.98, 3.98, 14.46, 16.51), 'c': pd.Categorical(['R', 'R', 'R', 'R', 'F

有两个索引不同但列匹配的数据帧,如何计算它们之间的差异

例如,与

df1 = pd.DataFrame({ 'a': (188, 750, 1330, 1385, 188, 750, 1330, 1385),
                    'b': (51.12, 51.45, 74.49, 29.21, 39.98, 3.98, 14.46, 16.51),
                    'c': pd.Categorical(['R', 'R', 'R', 'R', 'F', 'F', 'F', 'F']) })
df1 = df1.set_index(['a'])

          b  c
a             
188   51.12  R
750   51.45  R
1330  74.49  R
1385  29.21  R
188   39.98  F
750    3.98  F
1330  14.46  F
1385  16.51  F


df2 = pd.DataFrame({ 'x': (20, 50),
                     'c': pd.Categorical(['R', 'F']) })
df2 = df2.set_index(['c'])

    x
c    
R  20
F  50
我想根据
df1
中的
c
列应与
df2
上的索引
c
匹配的条件,将
df1
中的
b
列与
df2
中的
x
列进行比较

结果是:

          b  c   diff
a                    
188   51.12  R  31.12
750   51.45  R  31.45
1330  74.49  R  54.49
1385  29.21  R   9.21
188   39.98  F -10.02
750    3.98  F -46.02
1330  14.46  F -35.54
1385  16.51  F -33.49
          b  c   diff
a                    
188   51.12  R  31.12
750   51.45  R  31.45
1330  74.49  R  54.49
1385  29.21  R   9.21
188   39.98  F -10.02
750    3.98  F -46.02
1330  14.46  F -35.54
1385  16.51  F -33.49
您可以使用或:

或:

输出:


这些方法是否也适用于系列,例如,如果df2是系列而不是数据帧。将一个系列转换成一个数据帧并提供一个列名是很容易的,但是我想进一步澄清一下,是的,这很容易。每列都是
系列
,因此例如
df2['x']
系列
df1['diff'] = df1['b'] - df1['c'].map(df2['x'])
print (df1)
          b  c   diff
a                    
188   51.12  R  31.12
750   51.45  R  31.45
1330  74.49  R  54.49
1385  29.21  R   9.21
188   39.98  F -10.02
750    3.98  F -46.02
1330  14.46  F -35.54
1385  16.51  F -33.49
df1.assign(diff = df1['b'] - df1['c'].map(df2.squeeze()))
          b  c   diff
a                    
188   51.12  R  31.12
750   51.45  R  31.45
1330  74.49  R  54.49
1385  29.21  R   9.21
188   39.98  F -10.02
750    3.98  F -46.02
1330  14.46  F -35.54
1385  16.51  F -33.49
df1["diff"] = df1.apply(lambda x: x.b - df2.loc[x.c].values[0],axis=1)