首页 > 解决方案 > 如何根据字符拆分列并在每次拆分时附加其余列

问题描述

考虑我有一个数据框:

a = [['A','def',2,3],['B|C','xyz|abc',56,3],['X|Y|Z','uiu|oi|kji',65,34],['K','rsq',98,12]]
df1 = pd.DataFrame(a, columns=['1', '2','3','4'])
df1
    1   2   3   4
0   A   def 2   3
1   B|C xyz|abc 56  3
2   X|Y|Z   uiu|oi|kji  65  34
3   K   rsq 98  12

首先,如何打印所有带有“|”的行 在第 1 列?我正在尝试以下操作,但它会打印框架的所有行:

df1[df1[1].str.contains("|")]

其次,如何在“|”上拆分第 1 列和第 2 列,以便第 1 列中的每个拆分都从第 2 列获取相应的拆分,并将其余数据附加到每个拆分。例如,我想从 df1 得到这样的东西:

    1   2   3   4
0   A   def 2   3
1   B   xyz 56  3
2   C   abc 56  3
3   X   uiu 65  34
4   Y   oi  65  34
5   Z   kji 65  34
6   K   rsq 98  12

标签: pythonpandasdataframe

解决方案


您可以将自定义 lambda 函数与Series.str.splitlistSeries.explode中指定的列一起使用,然后将所有其他列添加到DataFrame.join

splitter = ['1','2']
cols = df1.columns.difference(splitter)
f = lambda x: x.str.split('|').explode()
df1 = df1[splitter].apply(f).join(df1[cols]).reset_index(drop=True)
print (df1)
   1    2   3   4
0  A  def   2   3
1  B  xyz  56   3
2  C  abc  56   3
3  X  uiu  65  34
4  Y   oi  65  34
5  Z  kji  65  34
6  K  rsq  98  12

|对于通过什么是特殊的正则表达式字符过滤or添加regex=FalseSeries.str.contains

print(df1[df1[1].str.contains("|" regex=False)])

或通过以下方式逃避它\|

print(df1[df1[1].str.contains("\|")])

推荐阅读