我有一个大型的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])
答案 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]
而不是使用split
或extract
即可(并且更简单)。
或者你可以这样做,这看起来几乎是愚蠢的,但它没有任何实际的错误,它相当紧凑。
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]
然后,您可能希望使用df1
将df2
和int
改为astype(int)
列。