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

在数据帧中拆分每个单元格(pandas/python),python,pandas,Python,Pandas,我有一个由许多行和列组成的大熊猫数据帧,这些行和列包含二进制数据,如“0 | 1”、“0 | 0”、“1 | 1”、“1 | 0”,我希望将其拆分为两个数据帧,并/或进行扩展,这样(这两个数据帧对我都很有用): 变成 a b c d rowa1 1 0 0 1 rowa2 0 1 1 0 rowb1 0 0 0 0 rowb2 1 0 0 1 rowc1 0 1 1 0 rowc2 1

我有一个由许多行和列组成的大熊猫数据帧,这些行和列包含二进制数据,如“0 | 1”、“0 | 0”、“1 | 1”、“1 | 0”,我希望将其拆分为两个数据帧,并/或进行扩展,这样(这两个数据帧对我都很有用):

变成

        a   b   c   d
rowa1   1   0   0   1
rowa2   0   1   1   0
rowb1   0   0   0   0
rowb2   1   0   0   1
rowc1   0   1   1   0
rowc2   1   0   0   1
和/或

    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])

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

将熊猫作为pd导入
df1=pd.DataFrame()
df2=pd.DataFrame()
#df的定义与第一个示例相同
对于df.列中的列:
df1[col]=df[col].str[0]
df2[col]=df[col].str[-1]

然后,您可能希望使用
astype(int)
user2734178将
df1
df2
重铸为
int
列,但他或她的答案有一些问题。这里有一个小的变化是有效的

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])
这是另一个稍微优雅一点的选择。将回路替换为:

for col in df.columns:
    df1[col] = df[col].str.extract("(\d)\|")
    df2[col] = df[col].str.extract("\|(\d)")

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

df1 = df.applymap( lambda x: str(x)[0] ) 
df2 = df.applymap( lambda x: str(x)[2] )
或者像在其他答案中一样在列上循环。我认为这无关紧要。请注意,因为问题指定了二进制数据,所以只需执行
str[0]
str[2]
而不是使用
split
extract
就可以了(而且更简单)

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

df1 = df.stack().str[0].unstack()
df2 = df.stack().str[2].unstack()

stack
只需将其转换为一个系列,这样您就可以使用
str
,然后
unstack
将其转换回数据帧。

您的数据来自文件吗?是的,我加载为数据帧的文件可以添加输入文件外观的片段吗?您的答案不太正确,但您可以使用
str[0]修复它
str.split(“|”)[0]
FYI不同,我没有投反对票,但您可能希望修复或删除非常大的数据集,您对使用内置pandas函数(如.str.extract()与使用python定义的lambda)的性能有何看法?我不确定extract是否以C语言实现extension@drootang我不确定在这种情况下,您可以使用ipython中的
%timeit
进行比较。一般来说,熊猫的优势在于能处理数字而不是字符串,所以这可能没什么大不了的。但是一般来说,
apply/lambda
比使用内置pandas方法要慢。@drootang好的,我在1000行数据上快速测试了你的2种方法和我的2种方法。从最快到最慢:拆分(3.28毫秒)、applymap(3.91毫秒)、堆栈(4.25毫秒)、提取(9.71毫秒)。有趣且令人惊讶!如果split是最快的,显式枚举列,我怀疑您在评论中建议只使用df[col].str[0]和df[col].str[1]可能是这里的冠军。
df1 = df.stack().str[0].unstack()
df2 = df.stack().str[2].unstack()