簡體   English   中英

迭代 Pandas DataFrame 以提取數據

[英]Iteration over a Pandas DataFrame to extract data

我有一個 DataFrame 在列中包含小時間隔,在行中包含員工 ID。 我想遍歷每一列(每小時間隔)並僅在列包含數字 1 時將其提取到列表中(1 表示它們在該小時內可用,0 表示它們不可用)

我試過 iterrows() 和 iteritems() 都沒有給我我想從這個 DataFrame 看到的東西

在此處輸入圖像描述

這是一個名為的新列表

可用 = [0800, 0900, 1000, 1100]

然后我可以提取最小值和最大值來創建時間表。

抱歉,如果這有點含糊,我對 Python 3 和 Pandas 很陌生

你不需要迭代

假設你有一個像這樣的 dataframe

    0   1   2   3   4   5   6   7   8   9
0   0   0   0   0   0   1   0   1   1   0
1   1   0   1   1   1   1   1   1   0   1
2   1   1   1   0   0   0   0   0   0   0
3   0   1   1   0   1   1   0   0   1   1
4   1   0   1   0   1   0   1   0   0   0
5   0   1   1   0   0   0   0   0   0   0
6   1   0   0   0   1   1   1   1   0   0
7   0   1   0   1   0   1   1   1   1   1
8   0   0   1   0   1   1   1   0   0   0
9   1   0   0   1   0   0   1   1   1   1

您可以使用此代碼獲取值為 1 的所有列的列名

df['available'] = df.apply(lambda row: row[row == 1].index.tolist(), axis=1)

    0   1   2   3   4   5   6   7   8   9   available
0   0   0   0   0   0   1   0   1   1   0   [5, 7, 8]
1   1   0   1   1   1   1   1   1   0   1   [0, 2, 3, 4, 5, 6, 7, 9]
2   1   1   1   0   0   0   0   0   0   0   [0, 1, 2]
3   0   1   1   0   1   1   0   0   1   1   [1, 2, 4, 5, 8, 9]
4   1   0   1   0   1   0   1   0   0   0   [0, 2, 4, 6]
5   0   1   1   0   0   0   0   0   0   0   [1, 2]
6   1   0   0   0   1   1   1   1   0   0   [0, 4, 5, 6, 7]
7   0   1   0   1   0   1   1   1   1   1   [1, 3, 5, 6, 7, 8, 9]
8   0   0   1   0   1   1   1   0   0   0   [2, 4, 5, 6]
9   1   0   0   1   0   0   1   1   1   1   [0, 3, 6, 7, 8, 9]

如果你想從中混合/最大,你可以使用

df['min_max'] = df['available'].apply(lambda x: (min(x), max(x)))

   available                  min_max
0   [5, 7, 8]                   (5, 8)
1   [0, 2, 3, 4, 5, 6, 7, 9]    (0, 9)
2   [0, 1, 2]                   (0, 2)
3   [1, 2, 4, 5, 8, 9]          (1, 9)
4   [0, 2, 4, 6]                (0, 6)
5   [1, 2]                      (1, 2)
6   [0, 4, 5, 6, 7]             (0, 7)
7   [1, 3, 5, 6, 7, 8, 9]       (1, 9)
8   [2, 4, 5, 6]                (2, 6)
9   [0, 3, 6, 7, 8, 9]          (0, 9)

你可以簡單地做

available = df.columns[df.T.any(axis=1)].tolist()

一般來說,不建議迭代 Pandas 數據幀,除非它們很小,因為 AFAIK 這不使用矢量化函數,因此速度較慢。

你能展示你的代碼的 rest 嗎?

假設 dataframe 中只有 0 和 1,則以下條件選擇應該有效(如果我正確解釋了您想要的內容;您似乎更有可能想要Shubham Periwal 發布的內容):

filtered_df = df[df != 0]
lists = filtered_df.values.tolist()

或在 1 行中:

lists = df[df != 0].values.tolist()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM