在数据帧中拆分每个单元格(pandas/python)

2024-03-29 11:58:51 发布

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

我有一个大型pandas数据帧,由许多行和列组成,其中包含二进制数据,如“0 | 1”、“0 | 0”、“1 | 0”,我希望将其拆分为2个数据帧,并/或展开,以便(这两个数据帧对我都有用):

        a   b   c   d
rowa    1|0 0|1 0|1 1|0
rowb    0|1 0|0 0|0 0|1
rowc    0|1 1|0 1|0 0|1

变成

^{pr2}$

和/或

    df1:    a   b   c   d
    rowa    1   0   0   1
    rowb    0   0   0   0
    rowc    0   1   1   0


    df2:    a   b   c   d
    rowa    0   1   1   0
    rowb    1   0   0   1
    rowc    1   0   0   1

目前我正在尝试做如下的事情,但相信这不是很有效,任何指导都会有帮助。在

Atmp_dict=defaultdict(list)
Btmp_dict=defaultdict(list)

for index,row in df.iterrows():
    for columnname in list(df.columns.values):
        Atmp_dict[columnname].append(row[columnname].split('|')[0])
        Btmp_dict[columnname].append(row[columnname].split('|')[1])

Tags: 数据indffordictlistrowbtmp
3条回答

用户2734178很接近,但他或她的回答有一些问题。这里有一个小小的变化

import pandas as pd

df1 = pd.DataFrame()
df2 = pd.DataFrame()

# df is your original DataFrame
for col in df.columns:
    df1[col] = df[col].apply(lambda x: x.split('|')[0])
    df2[col] = df[col].apply(lambda x: x.split('|')[1])

这是另一个稍微更优雅的选择。将循环替换为:

^{pr2}$

因为看起来所有的值都是字符串,所以可以使用.str访问器将管道作为分隔符comme ca来拆分所有内容

import pandas as pd

df1 = pd.DataFrame()
df2 = pd.DataFrame()

#df is defined as in your first example
for col in df.columns:
    df1[col] = df[col].str[0]
    df2[col] = df[col].str[-1]

然后您可能需要使用astype(int)df1和{}重新构造为int列。在

这是相当紧凑的,但似乎应该有一个更简单,更紧凑的方法。在

df1 = df.applymap( lambda x: str(x)[0] ) 
df2 = df.applymap( lambda x: str(x)[2] )

或者像其他答案一样在列上循环。我觉得没关系。请注意,因为问题指定了二进制数据,所以只做str[0]和{},而不是使用split或{},这是可以的(而且更简单)。在

或者你可以这样做,这看起来很傻,但实际上没有什么问题,它相当紧凑。在

^{pr2}$

stack只需将其转换为一个序列,这样就可以使用str,然后{}将其转换回数据帧。在

相关问题 更多 >