在上融化并过滤数据帧

2024-06-17 08:09:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个巨大的熊猫数据框,有数百万行和数千列。 请参见下面的示例。你知道吗

X   Y   col_1   col_2   col_3   col_4   col_5   col_6   col_7   col_8   col_9   col_10
0   A   1   0   0   0   0   0   1   1   1   1   1
1   B   1   0   0   0   0   0   1   1   1   1   1
2   C   2   0   0   0   0   0   1   1   1   1   1
3   A   3   0   0   0   0   0   1   1   1   1   1

我想在X上使用pd.melt,在col_1col_10列中使用Y来融化数据帧。我将在我的原始数据帧中有更多的列。你知道吗

我可以这样做

pd.melt(s, ['X', 'Y'], [x for x in s.columns if x not in ['X', 'Y']])

融化后,我会有一个这样的数据帧

    X   Y   variable    value
0   A   1   col_1   0
1   B   1   col_1   0
2   C   2   col_1   0
3   A   3   col_1   0
4   A   1   col_2   0
5   B   1   col_2   0
6   C   2   col_2   0
7   A   3   col_2   0
8   A   1   col_3   0
9   B   1   col_3   0
10  C   2   col_3   0
11  A   3   col_3   0
12  A   1   col_4   0
13  B   1   col_4   0
14  C   2   col_4   0
15  A   3   col_4   0
16  A   1   col_5   0
17  B   1   col_5   0
18  C   2   col_5   0
19  A   3   col_5   0
20  A   1   col_6   1
21  B   1   col_6   1
22  C   2   col_6   1
23  A   3   col_6   1
24  A   1   col_7   1
25  B   1   col_7   1
26  C   2   col_7   1
27  A   3   col_7   1
28  A   1   col_8   1
29  B   1   col_8   1
30  C   2   col_8   1
31  A   3   col_8   1
32  A   1   col_9   1
33  B   1   col_9   1
34  C   2   col_9   1
35  A   3   col_9   1
36  A   1   col_10  1
37  B   1   col_10  1
38  C   2   col_10  1
39  A   3   col_10  1

我只对值为1的行感兴趣,所以我会这样做

melted.loc[melted['value'] == 1]

只获取所需的行。你知道吗

但当我的数据如此庞大时,我会出现内存不足的错误,因为融化的数据填满了我的RAM并阻塞了它。这很有道理。你知道吗

我想在融化自己的同时根据变量进行过滤。类似于melt_filter这样我就不会耗尽内存。你知道吗

在我上面展示的例子中,列col_6col_10只是有1,然后可以先过滤再熔化。但事实并非如此。我将有一些混合了01的行。因此,我不能过滤之前的手。你知道吗

这样的事情可能吗。?如果是,怎么做。?你知道吗

编辑:许多评论解释如何通过某种方式过滤数据并将数据融化。我不能这样做,因为在实际数据中,没有任何列将完全为0,也没有任何列将完全为1。它将是0和1的混合。你知道吗


Tags: columns数据in示例for原始数据ifvalue
1条回答
网友
1楼 · 发布于 2024-06-17 08:09:41

更新 感谢@rafaelc的评论。我相信这个使用np.nonzero的解决方案的内存效率要高得多:

cols = df.columns[2:]
nonzeros = np.nonzero(df[cols].values)

# nonzeros consist of two arrays
# nonzeros[0] is the row coordinates of nonzero values
# nonzeros[1] is the col coordinates of nonzero values

# all we need is to extract rows at ['X','Y'] 
# and corresponding columns
# for each nonzero value:
pd.concat((df.loc[nonzeros[0], df.columns[:2]].reset_index(drop=True),
           df.columns[nonzeros[1]].to_frame().reset_index(drop=True)
          ),
          axis=1
         )

输出(值部分并不重要,因为它是1):

    X   Y   0
0   A   1   col_4
1   A   1   col_5
2   A   1   col_6
3   A   1   col_7
4   A   1   col_8
5   B   1   col_4
6   B   1   col_5
7   B   1   col_6
8   B   1   col_7
9   B   1   col_8
10  C   2   col_4
11  C   2   col_5
12  C   2   col_6
13  C   2   col_7
14  C   2   col_8
15  A   3   col_4
16  A   3   col_5
17  A   3   col_6
18  A   3   col_7
19  A   3   col_8

相关问题 更多 >