Pandas 最大单元格值的列名
Pandas column name of the max cell value
我有一个 df,它在最左边的列中有一些代码,在其他列中有一个正向配置文件(下面的 df1)
df1:
code tp1 tp2 tp3 tp4 tp5 tp6 \
0 1111 0.000000 0.000000 0.018714 0.127218 0.070055 0.084065
1 222 0.000000 0.000000 0.000418 0.000000 0.017540 0.003015
2 333 1.146815 1.305678 0.384918 0.688284 0.000000 0.000000
3 444 0.000000 0.000000 1.838797 0.000000 0.000000 0.000000
4 555 27.190002 27.134837 24.137560 17.739465 11.990806 8.631395
5 666 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
tp7 tp8 tp9 tp10
0 0.019707 0.000000 0.000000 0.000000
1 6.594860 10.535905 15.697232 21.035824
2 0.000000 0.000000 0.000000 0.000000
3 0.000000 0.000000 0.000000 0.000000
4 7.476197 6.461532 5.570051 4.730345
5 0.000000 0.000068 0.000000 0.000000
我希望输出为 3 列 df(下面的 df2),其中包含单元格的列名(对于每个代码),最后一个数字(+ve 或 -ve),后面只有 0 .第 2 列 (tp_with_max_num
) 将具有具有最大此类数字的列名称。
df2:
code max_tp tp_with_max_num
0 1111 tp7 tp4
1 222 tp10 tp10
2 333 tp4 tp2
3 444 tp3 tp3
4 555 tp10 tp1
5 666 tp8 tp8
使用这个:
我能够获得第 3 列:
input_df['tp_with_max_num'] = input_df.ix[0:6,1:].apply(lambda x: input_df.columns[1:][x == x.max()][0], axis=1)
我无法解决 df2 中的第二列....
如果您暂时将 0
替换为 NaN
,则可以在第 2 列的 return 具有最大值的列名称的行上使用 argmax
,然后您可以使用 last_valid_index
到 return 具有最后一个非零值的列:
In [117]:
df['max_tp'], df['tp_with_max_num'] = df.ix[:,'tp1':].replace(0,np.NaN).apply(lambda x: x.last_valid_index(), axis=1), df.ix[:,'tp1':].apply(lambda x: x.argmax(), axis=1)
df[['max_tp','tp_with_max_num']]
Out[117]:
max_tp tp_with_max_num
0 tp7 tp4
1 tp10 tp10
2 tp4 tp2
3 tp3 tp3
4 tp10 tp1
5 tp8 tp8
使用速度更快:
print (df.ix[:,'tp1':].idxmax(axis=1))
0 tp4
1 tp10
2 tp2
3 tp3
4 tp1
5 tp8
dtype: object
时间:
df = pd.concat([df]*1000).reset_index(drop=True)
In [128]: %timeit (df.ix[:,'tp1':].idxmax(axis=1))
100 loops, best of 3: 5.9 ms per loop
In [129]: %timeit (df.ix[:,'tp1':].apply(lambda x: x.argmax(), axis=1))
1 loop, best of 3: 237 ms per loop
In [130]: %timeit (df.ix[:,'tp1':].replace(0,np.NaN).apply(lambda x: x.last_valid_index(), axis=1))
10 loops, best of 3: 126 ms per loop
In [131]: %timeit (df.ix[:, 'tp1':].cumsum(axis=1).idxmax(axis=1))
100 loops, best of 3: 6.71 ms per loop
所以我和 的解决方案越快。
知道idxmax returns 第一个 最大值的索引,您可以使用 cumsum 查找其后只有零的列:
df.ix[:, 'tp1':].cumsum(axis=1).idxmax(axis=1)
Out[61]:
0 tp7
1 tp10
2 tp4
3 tp3
4 tp10
5 tp8
dtype: object
我有一个 df,它在最左边的列中有一些代码,在其他列中有一个正向配置文件(下面的 df1)
df1:
code tp1 tp2 tp3 tp4 tp5 tp6 \
0 1111 0.000000 0.000000 0.018714 0.127218 0.070055 0.084065
1 222 0.000000 0.000000 0.000418 0.000000 0.017540 0.003015
2 333 1.146815 1.305678 0.384918 0.688284 0.000000 0.000000
3 444 0.000000 0.000000 1.838797 0.000000 0.000000 0.000000
4 555 27.190002 27.134837 24.137560 17.739465 11.990806 8.631395
5 666 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
tp7 tp8 tp9 tp10
0 0.019707 0.000000 0.000000 0.000000
1 6.594860 10.535905 15.697232 21.035824
2 0.000000 0.000000 0.000000 0.000000
3 0.000000 0.000000 0.000000 0.000000
4 7.476197 6.461532 5.570051 4.730345
5 0.000000 0.000068 0.000000 0.000000
我希望输出为 3 列 df(下面的 df2),其中包含单元格的列名(对于每个代码),最后一个数字(+ve 或 -ve),后面只有 0 .第 2 列 (tp_with_max_num
) 将具有具有最大此类数字的列名称。
df2:
code max_tp tp_with_max_num
0 1111 tp7 tp4
1 222 tp10 tp10
2 333 tp4 tp2
3 444 tp3 tp3
4 555 tp10 tp1
5 666 tp8 tp8
使用这个:
input_df['tp_with_max_num'] = input_df.ix[0:6,1:].apply(lambda x: input_df.columns[1:][x == x.max()][0], axis=1)
我无法解决 df2 中的第二列....
如果您暂时将 0
替换为 NaN
,则可以在第 2 列的 return 具有最大值的列名称的行上使用 argmax
,然后您可以使用 last_valid_index
到 return 具有最后一个非零值的列:
In [117]:
df['max_tp'], df['tp_with_max_num'] = df.ix[:,'tp1':].replace(0,np.NaN).apply(lambda x: x.last_valid_index(), axis=1), df.ix[:,'tp1':].apply(lambda x: x.argmax(), axis=1)
df[['max_tp','tp_with_max_num']]
Out[117]:
max_tp tp_with_max_num
0 tp7 tp4
1 tp10 tp10
2 tp4 tp2
3 tp3 tp3
4 tp10 tp1
5 tp8 tp8
使用速度更快:
print (df.ix[:,'tp1':].idxmax(axis=1))
0 tp4
1 tp10
2 tp2
3 tp3
4 tp1
5 tp8
dtype: object
时间:
df = pd.concat([df]*1000).reset_index(drop=True)
In [128]: %timeit (df.ix[:,'tp1':].idxmax(axis=1))
100 loops, best of 3: 5.9 ms per loop
In [129]: %timeit (df.ix[:,'tp1':].apply(lambda x: x.argmax(), axis=1))
1 loop, best of 3: 237 ms per loop
In [130]: %timeit (df.ix[:,'tp1':].replace(0,np.NaN).apply(lambda x: x.last_valid_index(), axis=1))
10 loops, best of 3: 126 ms per loop
In [131]: %timeit (df.ix[:, 'tp1':].cumsum(axis=1).idxmax(axis=1))
100 loops, best of 3: 6.71 ms per loop
所以我和
知道idxmax returns 第一个 最大值的索引,您可以使用 cumsum 查找其后只有零的列:
df.ix[:, 'tp1':].cumsum(axis=1).idxmax(axis=1)
Out[61]:
0 tp7
1 tp10
2 tp4
3 tp3
4 tp10
5 tp8
dtype: object