我有一個大資料框,我想在 5 的視窗大小中找到每一行的最大值。這是一個形狀為 3*15 的 df 的簡單示例。對于第一行,前 5 個值中的最大值為 10,對于第二個視窗,最大值為 20,對于第 1 行的第三個視窗,最大值為 101。
import pandas as pd
df = pd.DataFrame()
df['a'] = [1, 0, 1]
df['b'] = [10,12,4]
df['c'] = [10, 0, 6]
df['d'] = [10,102,1]
df['aa'] = [-1, 10, 21]
df['bb'] = [10,12,31]
df['ac'] = [-1, 0, 41]
df['bv'] = [20,121,11]
df['a1'] = [3, 10, 1]
df['bx'] = [10,12,51]
df['ad'] = [6, 10, 1]
df['bn'] = [101,12,31]
df['aq'] = [2, 0, 1]
df['bp'] = [1,112,12]
df['ak'] = [23, 0, 1]
a b c d aa bb ac bv a1 bx ad bn aq bp ak
0 1 10 10 10 -1 10 -1 20 3 10 6 101 2 1 23
1 0 12 0 102 10 12 0 121 10 12 10 12 0 112 0
2 1 4 6 1 21 31 41 11 1 51 1 31 1 12 1
輸出:
v1 v2 v3
0 10 20 101
1 102 121 112
2 21 51 31
你能幫我解決這個問題嗎?
uj5u.com熱心網友回復:
我會使用 numpy 將其重塑為 5 寬而不是使用 numpy max,最后將其重塑為 3 寬
print(df.values.reshape((-1,5)).max(axis=1).reshape(-1,3))
[[ 10 20 101]
[102 121 112]
[ 21 51 31]]
uj5u.com熱心網友回復:
您可以先將資料框列拆分為 3 個部分
split = [df.columns[i*5:(i 1)*5] for i in range(3)]
然后,在 的幫助下df.loc,您可以獲得所需的資料幀。
pd.DataFrame([df.loc[:, i].max(axis=1) for i in split], index = ['v1','v2','v3'])
0 1 2
v1 10 102 21
v2 20 121 51
v3 101 112 31
uj5u.com熱心網友回復:
如果您希望將其推廣到任意數量的列或視窗大小:
from tqdm import tqdm
tqdm.pandas()
w = 5 # window size
df.progress_apply(lambda row: pd.Series([max(sub) for sub in arr.reshape(int(len(row)/w), w)], index=["v" str(i) for i in range(1, int(len(row)/w) 1)]), axis=1)
>> v1 v2 v3
>> 0 10 20 101
>> 1 10 20 101
>> 2 10 20 101
另外,您提到您有一個大型資料框 -progress_apply如果資料集非常大,將有助于跟蹤進度。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/516779.html
標籤:Python熊猫数据框
下一篇:串列中的最大出現次數
