返回DataFrame[Pandas]中数据组的位置(行和列)
大家早上好。我正在使用 Pandas,我有以下 DataFrame:
import pandas as pd
df = pd.DataFrame([[90.0,10.0,10.0,20.0,10.0], [30.0,30.0,20.0,70.0,20.0], [30.0,20.0,10.0,20.0,10.0], [20.0,10.0,80.0,10.0,0.0]], index=['v_12','v_23','v_34','v_15'], columns=['C_1','C_2','C_3','C_4','C_5'])
C_1 C_2 C_3 C_4 C_5
v_12 90.0 10.0 10.0 20.0 10.0
v_23 30.0 30.0 20.0 70.0 20.0
v_34 30.0 20.0 10.0 20.0 10.0
v_15 20.0 10.0 80.0 10.0 0.0
我正在 Pandas 中寻找一些方法/函数,它允许我知道大于或等于 70 的值的位置(行和列) (我知道这可以使用循环和条件语句来解决,但我想主持他们。)
我想得到类似的结果:
Value Row Colum
0 90.0 v_12 C_1
1 70.0 v_23 C_4
2 80.0 v_15 C_3
我知道使用“where”方法,我可以获得这样的数据帧:
df.where(df>=70)
C_1 C_2 C_3 C_4 C_5
v_12 90.0 NaN NaN NaN NaN
v_23 NaN NaN NaN 70.0 NaN
v_34 NaN NaN NaN NaN NaN
v_15 NaN NaN 80.0 NaN NaN
但事实是我不知道如何解决这个练习,而不是利用一个逐个元素的循环。
如果您知道任何可以帮助我获得类似结果的功能,我将非常感谢您的合作。谢谢。
回答
你可以这样做:
df.reset_index().melt(id_vars = 'index', var_name = 'column').query('value>=70')
index column value
0 v_12 C_1 90.0
11 v_15 C_3 80.0
13 v_23 C_4 70.0
或者
df.stack().reset_index(name='value').query('value>=70')
level_0 level_1 value
0 v_12 C_1 90.0
8 v_23 C_4 70.0
17 v_15 C_3 80.0
以上归功于@Henry Ecker
你也可以这样做:
ind = np.where(df>=70)
pd.DataFrame([(val, df.index[row], df.columns[col])
for val, (row, col) in zip(df.values[ind], zip(*ind))])
0 1 2
0 90.0 v_12 C_1
1 70.0 v_23 C_4
2 80.0 v_15 C_3