Python pandas: 获取数据框中值的位置
Python pandas: Getting the locations of a value in dataframe
假设我有以下数据框:
'a' 'b'
0 0 0
1 1 0
2 0 1
3 0 1
有什么方法可以获取存在特定值的 index/column 值?例如,类似于以下内容:
values = df.search(1)
会有values = [(1, 'a'), (2, 'b'), (3, 'b')]
.
df[df == 1].stack().index.tolist()
产量
[(1, 'a'), (2, 'b'), (3, 'b')]
使用 pd.melt + 一些其他修改。
import pandas as pd
df = pd.DataFrame({'a':[0,1,0,0],
'b':[0,0,1,1]})
df1 = pd.melt(df.reset_index(),id_vars=['index'])
df1 = df1[df1['value'] == 1]
locations = zip(df1['index'],df1['variable'])
输出:
[(1, 'a'), (2, 'b'), (3, 'b')]
如果您不介意使用 NumPy 数组,第一列表示索引位置,第二列表示列名的 index,因为它位于 df.columns
,那就很短了:
In [11]: np.argwhere(df)
Out[11]:
array([[1, 0],
[2, 1],
[3, 1]])
如果要将其格式化为具有实际列名的元组列表,您可以进一步执行:
In [12]: [(x, df.columns[y]) for x,y in np.argwhere(df)]
Out[12]: [(1, 'a'), (2, 'b'), (3, 'b')]
您可以对 np.argwhere
内的逻辑表达式使用相同的方法,例如假设您有一些随机数据的 DataFrame:
In [13]: dfrm
Out[13]:
A B C
0 0.382531 0.287066 0.345749
1 0.725201 0.450656 0.336720
2 0.146883 0.266518 0.011339
3 0.111154 0.190367 0.275750
4 0.757144 0.283361 0.736129
5 0.039405 0.643290 0.383777
6 0.632230 0.434664 0.094089
7 0.658512 0.368150 0.433340
8 0.062180 0.523572 0.505400
9 0.287539 0.899436 0.194938
[10 rows x 3 columns]
然后你可以这样做,例如:
In [14]: [(x, dfrm.columns[y]) for x,y in np.argwhere(dfrm > 0.8)]
Out[14]: [(9, 'B')]
作为搜索函数,可以这样定义:
def search(df, df_condition):
return [(x, df.columns[y]) for x,y in np.argwhere(df_condition(df))]
例如:
In [17]: search(dfrm, lambda x: x > 0.8)
Out[17]: [(9, 'B')]
In [18]: search(df, lambda x: x == 1)
Out[18]: [(1, 'a'), (2, 'b'), (3, 'b')]
假设我有以下数据框:
'a' 'b'
0 0 0
1 1 0
2 0 1
3 0 1
有什么方法可以获取存在特定值的 index/column 值?例如,类似于以下内容:
values = df.search(1)
会有values = [(1, 'a'), (2, 'b'), (3, 'b')]
.
df[df == 1].stack().index.tolist()
产量
[(1, 'a'), (2, 'b'), (3, 'b')]
使用 pd.melt + 一些其他修改。
import pandas as pd
df = pd.DataFrame({'a':[0,1,0,0],
'b':[0,0,1,1]})
df1 = pd.melt(df.reset_index(),id_vars=['index'])
df1 = df1[df1['value'] == 1]
locations = zip(df1['index'],df1['variable'])
输出:
[(1, 'a'), (2, 'b'), (3, 'b')]
如果您不介意使用 NumPy 数组,第一列表示索引位置,第二列表示列名的 index,因为它位于 df.columns
,那就很短了:
In [11]: np.argwhere(df)
Out[11]:
array([[1, 0],
[2, 1],
[3, 1]])
如果要将其格式化为具有实际列名的元组列表,您可以进一步执行:
In [12]: [(x, df.columns[y]) for x,y in np.argwhere(df)]
Out[12]: [(1, 'a'), (2, 'b'), (3, 'b')]
您可以对 np.argwhere
内的逻辑表达式使用相同的方法,例如假设您有一些随机数据的 DataFrame:
In [13]: dfrm
Out[13]:
A B C
0 0.382531 0.287066 0.345749
1 0.725201 0.450656 0.336720
2 0.146883 0.266518 0.011339
3 0.111154 0.190367 0.275750
4 0.757144 0.283361 0.736129
5 0.039405 0.643290 0.383777
6 0.632230 0.434664 0.094089
7 0.658512 0.368150 0.433340
8 0.062180 0.523572 0.505400
9 0.287539 0.899436 0.194938
[10 rows x 3 columns]
然后你可以这样做,例如:
In [14]: [(x, dfrm.columns[y]) for x,y in np.argwhere(dfrm > 0.8)]
Out[14]: [(9, 'B')]
作为搜索函数,可以这样定义:
def search(df, df_condition):
return [(x, df.columns[y]) for x,y in np.argwhere(df_condition(df))]
例如:
In [17]: search(dfrm, lambda x: x > 0.8)
Out[17]: [(9, 'B')]
In [18]: search(df, lambda x: x == 1)
Out[18]: [(1, 'a'), (2, 'b'), (3, 'b')]