我正在阅读panda的csv文件。我需要根据给定列中的字符串数量复制行(可能是多个)。例如,使用col1和separator" |":
in_csv:
col1,col2,col3
ABC | EFG,1,a
ABC | EFG,1,bb
ABC | EFG,2,c
out_csv:
col1,col2,col3
ABC,1,a
EFG,1,a
ABC,1,bb
EFG,1,bb
ABC,2,c
EFG,2,c
我尝试使用incsv_dt.row1.iloc [ii] .split(' |')逐行读取循环,但我相信应该有一种更简单的方法。 col1中的字符串由|分隔可能是多个
由于
答案 0 :(得分:0)
未排序,如果有没有“|”的条目可能无效在第一列。根据'col1'创建两个数据帧,然后将它们一起添加。如果col1中有多个'|',也可能无效。
df = pd.DataFrame()
df['col1'] = ['APC|EFG', 'APC|EFG','APC|EFG']
df['col2'] = [1,1,2]
df['col3'] = ['a','bb','c']
# split into two columns based on '|' delimiter
df = pd.concat([df, df['col1'].str.split('|', expand = True)], axis=1)
# create two dataframes with new labels
df2 = df.drop(['col1',1], axis=1)
df2.rename(columns={0: 'col1'}, inplace=True)
df3 = df.drop(['col1',0], axis=1)
df3.rename(columns={1: 'col1'}, inplace=True)
# append them together
df = df2.append(df3)
答案 1 :(得分:0)
示例设置:
df = pd.DataFrame()
df['col1'] = ['APC|EFG', 'APC', 'APC|EFG|XXX']
df['col2'] = [1, 1, 2]
df['col3'] = ['a', 'bb', 'c']
您可以首先使用拆分的列创建一个新的数据框。 然后删除空值。如果某些值具有 多次拆分,有些没有。
dfs = df['col1'].str.split('|',
expand = True).unstack().reset_index().set_index('level_1')[0].dropna().to_frame()
要将其与原始数据帧合并,请确保索引相同。 当我尝试时,原始数据框具有RangeIndex,因此我将其转换为 整数
df.index = list(df.index)
然后,您可以合并索引上的数据框,并将新列重命名为'col1'
df_result = pd.merge(dfs,
dfx[['col2', 'col3']],
left_index=True, right_index=True,
how='outer').rename(columns={0: 'col1'})
print(df_result)
结果
col1 col2 col3
0 APC 1 a
0 EFG 1 a
1 APC 1 bb
2 APC 2 c
2 EFG 2 c
2 XXX 2 c