我有一個包含一系列月份的資料框,每行包含一個 1 或 0 的值。如何找到第一次出現 1 和最后一次出現 1 的索引?
我考慮將所有列組合在一起以創建 1 行,其中僅包含所有 0 和 1 的串列,然后列舉它以獲得最小值和最大值,但我一直堅持將所有內容分組并將其放入一列
這是我的資料集的示例:
Jan 2020 Feb2020 March 2020 April 2020 May 2020
User1 1 0 0 0 0
User2 0 1 1 0 1
User 3 1 1 1 1 1
我希望我的輸出看起來像這樣:
Jan 2020 Feb2020 March 2020 April 2020 May 2020 First_occurance Last Occurance
User1 1 0 0 0 0 1 1
User2 0 1 1 0 1 2 5
User 3 1 1 1 1 1 1 5
uj5u.com熱心網友回復:
對于沒有回圈/應用的解決方案,您可以使用:
import numpy as np
out = df.join(
(df*(np.arange(df.shape[1]) 1))
.where(df.eq(1))
.agg(['min', 'max'], axis=1)
.rename(columns={'min': 'first occurrence',
'max': 'last occurrence',
})
.convert_dtypes()
)
或者,修改 DataFrame:
df[['first occurrence', 'last occurrence']] = (
(df*(np.arange(df.shape[1]) 1))
.where(df.eq(1))
.agg(['min', 'max'], axis=1)
.convert_dtypes()
)
輸出:
Jan 2020 Feb2020 March 2020 April 2020 May 2020 first occurrence last occurrence
User1 1 0 0 0 0 1 1
User2 0 1 1 0 1 2 5
User 3 1 1 1 1 1 1 5
uj5u.com熱心網友回復:
你可以用numpy.where這個。你沒有提到;但以下也將不出現處理為-1,否則將導致陣列索引錯誤。
def get_first_last_occurrence(row):
arr = np.where(row.to_numpy() == 1)
if len(arr):
return pd.Series({"First Occurrence":arr[0][0], "Last Occurrence":arr[0][-1]})
else:
return -1
df[["First Occurrence", "Last Occurrence"]] = df.apply(lambda row: get_first_last_occurrence(row), axis=1)
>> User Jan2020 Feb2020 March2020 April2020 May2020 First Occurrence Last Occurrence
>> 0 User1 1 0 0 0 0 1 1
>> 1 User2 0 1 1 0 1 2 5
>> 2 User3 1 1 1 1 1 1 5
uj5u.com熱心網友回復:
這是另一種解決方案,它回傳每次出現的列標簽而不是整數。
從此資料框開始:
In [3]: df
Out[3]:
Jan_2020 Feb_2020 March_2020 April_2020 May_2020
User1 1 0 0 0 0
User2 0 1 1 0 1
User3 1 1 1 1 1
我們可以得到我們感興趣的月份的名稱cumsum()和 row-wise apply():
In [4]: df.cumsum(axis=1).apply(lambda row: (row[row == 1].idxmin(), row.idxmax()), axis=1)
Out[4]:
User1 (Jan_2020, Jan_2020)
User2 (Feb_2020, May_2020)
User3 (Jan_2020, May_2020)
dtype: object
對于每一行,回傳由 的最低索引組成的元組cumsum == 1,以及累積總和在該行的最大值處的第一個索引(idxmax()回傳重復最大值的第一次出現)。
如果您想要回傳資料框(即,將新列分配給原始資料框):
df[["first", "last"]] = df.cumsum(axis=1).apply(lambda row: pd.Series([row[row == 1].idxmin(), row.idxmax()]), axis=1)
也許清理它:
def get_first_last(row):
csum = row.cumsum()
first = csum[csum == 1].idxmin()
last = csum.idxmax()
return pd.Series({"first": first, "last": last})
df.apply(get_first_last, axis=1)
輸出:
first last
User1 Jan_2020 Jan_2020
User2 Feb_2020 May_2020
User3 Jan_2020 April_2020
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/518249.html
標籤:Python熊猫数据框
上一篇:帶有中值標簽的箱線圖和下面的n表
