我有一個巨大df的看起來像這樣:
| 日期 | 庫存1 | 庫存2 | 股票3 | 庫存4 | 庫存5 | 庫存6 | 庫存7 | 庫存8 | 庫存9 | 庫存10 |
|---|---|---|---|---|---|---|---|---|---|---|
| 10/20 | 0.1 | 0.2 | 0.3 | 0.4 | 0.5 | 0.6 | 0.7 | 0.8 | 0.9 | 0.9 |
| 11/20 | 0.8 | 0.9 | 0.3 | 0.4 | 0.3 | 0.5 | 0.3 | 0.2 | 0.4 | 0.1 |
| 12/20 | 0.3 | 0.6 | 0.9 | 0.5 | 0.6 | 0.7 | 0.8 | 0.7 | 0.9 | 0.1 |
我想為每一行找到股票價值高出 20% 和低 20% 的股票。輸出應該是:
| 日期 | 更高 | 降低 |
|---|---|---|
| 10/20 | 庫存9,庫存10 | 庫存1,庫存2 |
| 11/20 | 庫存1,庫存2 | 庫存8,庫存10 |
| 12/20 | 庫存3,庫存9 | 庫存1,庫存10 |
我的代碼現在看起來像這樣:
l= df.count(1)
rank = pd.DataFrame()
for i in len(l):
rank[i, "winners"] = df.apply(lambda x: x.nlargest(round(l[i-1]*0.2).index.tolist(), axis=1)
rank[i, "losers"] = df.apply(lambda x: x.nsmallest(round(l[i-1]*0.2).index.tolist(), axis=1)
我收到錯誤“TypeError:'int' object is not callable”。我檢查了 l 的 dtype:頻率:M,長度:344,dtype:float64。我做錯了什么?
uj5u.com熱心網友回復:
采用:
df = pd.DataFrame({'stock1':range(10), 'stock2':range(10,20), 'stock3':range(10,20), 'stock4':range(10,20), 'stock5':range(50,60)})
colnum = int(.2*len(df.columns))
df.apply(lambda x: x.nlargest(colnum).index.tolist(), axis=1)
輸入df:

輸出:

根據您的評論:
df = pd.DataFrame({f'stock{i}':np.random.randint(1,10,10) for i in range(2000)})
colnum = int(.2*len(df.columns))
df.apply(lambda x: x.nlargest(colnum).index.tolist(), axis=1)
輸入 df 2000 列:

輸出:

根據其他評論,可能有 nans:
df = pd.DataFrame({f'stock{i}':np.random.randint(1,10,10) for i in
range(10)})
df2 = pd.DataFrame({f'stock{i}':np.random.randint(1,10,1) for i in range(7)})
df3 = df.append(df2)
df3 = df3.astype(np.float64)
df3.apply(lambda x: x.nlargest(int(.2*np.sum([1 for y in x if not np.isnan(y)]))).index.tolist(), axis=1)
輸入df:

輸出:

好一點:
df3.apply(lambda x: x.nlargest(int(.2*x.notna().sum())).index.tolist(), axis=1)
uj5u.com熱心網友回復:
用于DataFrame.assign新列:
df1 = df.set_index('date')
i= int(round(len(df1.columns)*0.2))
df1 = df1.assign(winners = df1.apply(lambda x: x.nlargest(i).index.tolist(), axis=1),
losers = df1.apply(lambda x: x.nsmallest(i).index.tolist(), axis=1))
rank = df1[['winners','losers']].reset_index()
print (rank)
date winners losers
0 10/20 [stock9, stock10] [stock1, stock2]
1 11/20 [stock2, stock1] [stock10, stock8]
2 12/20 [stock3, stock9] [stock10, stock1]
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/429684.html
下一篇:如何按降序對兩個陣列進行排序?
