繁体   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