在dataframe中分割每个单元格(pandas / python)

时间:2015-08-04 21:00:14

标签: python pandas

我有一个大型的pandas数据框,包含许多行和列,包含二进制数据,如' 0 | 1',' 0 | 0',' 1 | 1&#39 ;,' 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

变为

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

3 个答案:

答案 0 :(得分:2)

user2734178已关闭,但他或她的回答有一些问题。这是一个有效的微小变化

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

答案 1 :(得分:1)

这非常紧凑,但似乎应该有一种更简单,更紧凑的方式。

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

或者像其他答案一样循环遍历列。我认为这不重要。请注意,因为问题指定了二进制数据,所以只需执行str[0]str[2]而不是使用splitextract即可(并且更简单)。

或者你可以这样做,这看起来几乎是愚蠢的,但它没有任何实际的错误,它相当紧凑。

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

stack只需将其转换为系列文集即可,您可以使用str,然后unstack将其转换回数据框。

答案 2 :(得分:0)

由于您的所有值看起来都是字符串,因此您可以使用.str访问器将管道拆分为分隔符,例如,

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]

然后,您可能希望使用df1df2int改为astype(int)列。