Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.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 问题:将基于列值选择的两个不同数据帧的值除以,返回NaN_Python_Pandas_Dataframe - Fatal编程技术网

Python 问题:将基于列值选择的两个不同数据帧的值除以,返回NaN

Python 问题:将基于列值选择的两个不同数据帧的值除以,返回NaN,python,pandas,dataframe,Python,Pandas,Dataframe,我试图根据某些列值从两个不同的数据帧中选择值,并将它们相互分割。如果我尝试这个,我总是得到NaN值 我在下面添加了一个简化示例: df = pd.DataFrame({'col1':['a','b','c','d'], 'col2':['x1','x2','x3','x4'], 'col3':[10,3,2,8]}) print(df) df1 = pd.DataFrame({'col1':['a1','b1','c1

我试图根据某些列值从两个不同的数据帧中选择值,并将它们相互分割。如果我尝试这个,我总是得到NaN值

我在下面添加了一个简化示例:

df = pd.DataFrame({'col1':['a','b','c','d'],
                  'col2':['x1','x2','x3','x4'],
                   'col3':[10,3,2,8]})

print(df)

df1 = pd.DataFrame({'col1':['a1','b1','c1','d1'],
                  'col2':['y1','y1','y3','y4'],
                   'col3':[5,4,1,6]})

print(df1)

a = df.loc[((df['col1']=='a')&(df['col2']=='x1')),'col3']
print(a)

b = df1.loc[((df1['col1']=='d1')&(df1['col2']=='y4')), 'col3']
print(b)

c = a/b

print(c)

如何克服这个问题?

熊猫是如此强大,因为它在做某些动作时,例如数学方法时,会与指数保持一致

如果我们在您的示例中同时打印
a
b
,我们可以看到它们的索引分别为
0
3

print(a.index)
print(b.index)

Int64Index([0], dtype='int64')
Int64Index([3], dtype='int64')
这意味着在执行操作
a/b
时,pandas无法对齐任何值,因此返回
NaN

您的解决方案是重置索引:

a.reset_index(drop=True) / b.reset_index(drop=True)

0    1.666667
Name: col3, dtype: float64
或强制转换为
numpy
数组,因此我们将丢失索引:

a.to_numpy() / b.to_numpy()

array([1.66666667])


话虽如此,您的操作似乎并不符合逻辑,问题可能更深层。由于值的匹配现在没有任何意义。

尝试
a.div(b.array)
a/(b.array)
a
正在用值
10
提取第0行,
b
正在用值
6
提取第3行。当您进行除法时,pandas试图用匹配行中的值进行除法,但由于
a
没有第3行,
b
没有第0行,因此两行都得到NaN。谢谢您,这非常有帮助,是的,我使用的实际数据帧要复杂得多,我只尝试使用一个简单的示例。但你的解决方案解决了这个问题!