python - 如何根据字符拆分列并在每次拆分时附加其余列
问题描述
考虑我有一个数据框:
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
解决方案
您可以将自定义 lambda 函数与Series.str.split
listSeries.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=False
到Series.str.contains
:
print(df1[df1[1].str.contains("|" regex=False)])
或通过以下方式逃避它\|
:
print(df1[df1[1].str.contains("\|")])
推荐阅读
- java - 当用户使用 java 输入时,如何更有效地从 Yammer 获取消息?
- mysql - 仅获取每个代码最近日期的记录
- flutter - 键盘将文本字段推离屏幕
- apache-flink - Flink 作业创建 RocksDB 实例失败
- google-shopping-api - Google Shopping API - 删除数据。我用什么作为id?
- kotlin - 谷歌地图在 Fragment Kotlin 中不可见
- python - 在 IndexError 之后获取 python 代码以保持不变
- html - 如何将 HTML 文件从另一个程序集加载到 WPF WebBrowser 控件
- google-app-engine - 如何通过来自 AppEngine 上 Node.Js 的 http 请求获取数据?
- scala - Scala Try[Unit] 混淆