Python Pandas 在函数中引用不明确的列和行

Python Pandas Referencing ambiguous column and rows in a function

我有两个数据框

import pandas as pd

df = pd.DataFrame({'Foo': ['A','B','C','D','E'],
'Score': [4,6,2,7,8]
})

df2 = pd.DataFrame({'Bar': ['Z','Y','X','W','V'],
'Score': [5,10,10,5,9]
})

print (df)
print (df2)

和一个函数:

def DiffMatrix(df, df2):
    n=pd.DataFrame()
    for i in range(len(df2)):
        x = df2.ix[df.index[i], 'Score']
        y= x - df['Score']
        n = n.append(y, ignore_index=True)
    return n

diff= DiffMatrix(df, df2)
print (diff)

[5 rows x 2 columns]
   0  1  2  3  4
0  1 -1  3 -2 -3
1  6  4  8  3  2
2  6  4  8  3  2
3  1 -1  3 -2 -3
4  5  3  7  2  1

[5 rows x 5 columns]

但是如果我更改索引或更改列名称,例如:

df=df.set_index('Foo')
df2=df2.set_index('Bar')

df2 = pd.DataFrame({'Bar': ['Z','Y','X','W','V'],
'ScoreX': [5,10,10,5,9]
})

该函数无法运行,因为引用依赖于列名 'Score'。有没有办法更改代码以将 df['Score'] 模糊地引用为第一列,并适应索引中的更改,以便如果我更改索引,输出将变为:

    A   B   C   D   E
Z   1   -6  3   -2  -3
Y   6   4   8   3   2
X   6   4   8   3   2
W   1   -1  3   -2  -3
V   5   3   7   2   1 

您可以通过索引引用 Panda 的列,所以如果您知道您总是想要引用第 2 列(基于 0 的索引),那么您可以这样做。

而不是:

y= x - df['Score']

这样做:

y= x - df[df.columns[1]]

编辑

根据 OP 关于选择特定行的要求,您可以使用 pandas.DataFrame.iloc[...]

例如你可以这样做:

diff.iloc[[0]]

在您的 diff 数据框上产生以下输出:

   0  1  2  3  4
0  1 -1  3 -2 -3

如果您想 select 可以使用切片的多行或您想要的行索引列表

#slicing
diff.iloc[1:4]

给你

   0  1  2  3  4
1  6  4  8  3  2
2  6  4  8  3  2
3  1 -1  3 -2 -3

#list of row indices
diff.iloc[[0,2,4]]

产量

   0  1  2  3  4
0  1 -1  3 -2 -3
2  6  4  8  3  2
4  5  3  7  2  1

您可能想使用 .iloc 方法访问您的数据:

df = pd.DataFrame({'A':[1,2], 'B':[3,4]}, index=['x', 'y'])
df

   A  B
x  1  3
y  2  4

因此要访问第 2 行:

df.iloc[1,:]

A    2
B    4
Name: y, dtype: int64

并访问第 2 列

df.iloc[:,1]

x    3
y    4
Name: B, dtype: int64

事实上,你可以将它们混合并得到一个标量:

df.iloc[1,1]

4