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
我有两个数据框
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