gpt4 book ai didi

python - 根据值选择 pandas 数据框的列

转载 作者:行者123 更新时间:2023-11-30 22:39:22 26 4
gpt4 key购买 nike

我有一个非常简单的问题无法解决:

我有一个如下所示的数据框:

               DB         GOOG        ATVI         TSLA        TWTR
1.0 -0.0129755 -0.00463688 -0.00408223 0.0653678 0.0779629
2.0 -0.052772 -0.00712359 -0.0120323 0.0230537 0.0245435
3.0 0.00875274 0.00762426 0.00176186 0.0834672 -0.0017326
4.0 -0.0125196 0.00657628 -0.00235884 0.0502074 0.0157572
5.0 -0.0470443 -0.00382168 -0.0153009 -0.0325997 -0.0235564
6.0 0.0140261 -0.00630647 -0.00265291 -0.037598 -0.0454938
7.0 0.000624415 -0.00429897 -0.00088587 -9.73558e-05 -0.0216945
8.0 -0.0138933 -0.00455289 -0.027357 -0.00682128 -0.0186916
9.0 -0.00311624 -0.000168211 -0.0100577 -0.00894537 -0.00181214
10.0 0.0864933 0.0151531 0.05061 0.0294589 0.0395802

对于每一行我想找到最大、第二大和最小值对应的列名。

示例:

对于第一行(索引 1.0),我想提取 TWTR(最大值)、TSLA(第二大值)和 DB(最小值)。

...

对于第五行(索引5.0),我想提取GOOG(最大值)、ATVI(第二大值)和DB(最小值)

..等等。

最简单的方法是什么?谢谢!

最佳答案

您可以使用非常快numpy.argsort通过每行排序值更改列名称:

print (np.argsort(-df.values, axis=1))
[[4 3 2 1 0]
[4 3 1 2 0]
[3 0 1 2 4]
[3 4 1 2 0]
[1 2 4 3 0]
[0 2 1 3 4]
[0 3 2 1 4]
[1 3 0 4 2]
[1 4 0 3 2]
[0 2 4 3 1]]

print (df.columns[np.argsort(-df.values, axis=1)])
Index([['TWTR', 'TSLA', 'ATVI', 'GOOG', 'DB'],
['TWTR', 'TSLA', 'GOOG', 'ATVI', 'DB'],
['TSLA', 'DB', 'GOOG', 'ATVI', 'TWTR'],
['TSLA', 'TWTR', 'GOOG', 'ATVI', 'DB'],
['GOOG', 'ATVI', 'TWTR', 'TSLA', 'DB'],
['DB', 'ATVI', 'GOOG', 'TSLA', 'TWTR'],
['DB', 'TSLA', 'ATVI', 'GOOG', 'TWTR'],
['GOOG', 'TSLA', 'DB', 'TWTR', 'ATVI'],
['GOOG', 'TWTR', 'DB', 'TSLA', 'ATVI'],
['DB', 'ATVI', 'TWTR', 'TSLA', 'GOOG']],
dtype='object')
<小时/>
df = pd.DataFrame(df.columns[np.argsort(-df.values, axis=1)][:,[0,1,-1]], index=df.index)
df.columns = ['largest','second largest','smallest']
print (df)
largest second largest smallest
1.0 TWTR TSLA DB
2.0 TWTR TSLA DB
3.0 TSLA DB TWTR
4.0 TSLA TWTR DB
5.0 GOOG ATVI DB
6.0 DB ATVI TWTR
7.0 DB TSLA TWTR
8.0 GOOG TSLA ATVI
9.0 GOOG TWTR ATVI
10.0 DB ATVI GOOG

另一种解决方案(较慢),具有 apply 和自定义函数,其中对每行进行排序并获取索引:

def f(x):
x = x.sort_values()
return pd.Series([x.index[-1], x.index[-2], x.index[0]],
index=['largest','second largest','smallest'])

df = df.apply(f ,axis=1)
print (df)
largest second largest smallest
1.0 TWTR TSLA DB
2.0 TWTR TSLA DB
3.0 TSLA DB TWTR
4.0 TSLA TWTR DB
5.0 GOOG ATVI DB
6.0 DB ATVI TWTR
7.0 DB TSLA TWTR
8.0 GOOG TSLA ATVI
9.0 GOOG TWTR ATVI
10.0 DB ATVI GOOG
<小时/>
df = df.apply(lambda x: x.sort_values().index ,axis=1)
df = df.iloc[:, [-1,-2,0]]
df.columns = ['largest','second largest','smallest']
print (df)
largest second largest smallest
1.0 TWTR TSLA DB
2.0 TWTR TSLA DB
3.0 TSLA DB TWTR
4.0 TSLA TWTR DB
5.0 GOOG ATVI DB
6.0 DB ATVI TWTR
7.0 DB TSLA TWTR
8.0 GOOG TSLA ATVI
9.0 GOOG TWTR ATVI
10.0 DB ATVI GOOG

时间:

#[10000 rows x 5 columns]
df = pd.concat([df]*1000).reset_index(drop=True)
<小时/>
In [357]: %timeit pd.DataFrame(df.columns[np.argsort(-df.values, axis=1)][:,[0,1,-1]], index=df.index, columns=['largest','second largest','smallest'])
1000 loops, best of 3: 974 µs per loop

In [358]: %timeit df.apply(f ,axis=1)
1 loop, best of 3: 3.91 s per loop

In [361]: %timeit df.apply(lambda x: x.sort_values().index ,axis=1).iloc[:, [-1,-2,0]]
1 loop, best of 3: 1.88 s per loop

In [362]: %timeit df.apply(lambda x: x.sort_values().index.to_series().iloc[0], axis=1)
1 loop, best of 3: 2.47 s per loop

In [363]: %timeit df.apply(lambda x: x.sort_values(ascending=False).index.to_series().iloc[0], axis=1)
1 loop, best of 3: 2.51 s per loop

In [364]: %timeit df.apply(lambda x: x.sort_values(ascending=False).index.to_series().iloc[1], axis=1)
1 loop, best of 3: 2.52 s per loop

In [365]: %timeit [df.T.sort_values(by=k).T.keys()[-1] for k in df.T.keys()]
1 loop, best of 3: 6.42 s per loop

关于python - 根据值选择 pandas 数据框的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43181583/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com