关于同一主题还有其他问题,它们有所帮助,但我有一个额外的转折。
我有一个在每个(但不是全部)单元格中有多个值的数据框。
df = pd.DataFrame({'a':["10-30-410","20-40-500","25-50"], 'b':["5-8-9","4", "99"]})
指数 | 一种 | 乙 |
---|---|---|
0 | 10-30-410 | 5-8-9 |
1 | 20-40-500 | 4 |
2 | 25-50 | 99 |
如何通过破折号“-”拆分每个单元格并创建三个新数据框?请注意,并非所有单元格都有多个值,在这种情况下,第二个和第三个数据帧将变为 NA 或空白(将它们视为字符串)。
所以我需要 df1 成为这些值中的第一个:
指数 | 一种 | 乙 |
---|---|---|
0 | 10 | 5 |
1 | 20 | 4 |
2 | 25 | 99 |
而 df2 将是:
指数 | 一种 | 乙 |
---|---|---|
0 | 30 | 8 |
1 | 40 | |
2 | 50 |
对于 df3 也是如此:
指数 | 一种 | 乙 |
---|---|---|
0 | 410 | 9 |
1 | 500 | |
2 |
我用这个得到了 df1
df1 = df.replace(r'(\d+).*(\d+).*(\d+)+', r'\1', regex=True)
但是 df2 不太好用。我得到了第二个值,还有 4 和 99,它们应该是空白的。
df2 = df.replace(r'(\d+)-(\d+).*', r'\2', regex=True)
指数 | 一种 | 乙 |
---|---|---|
0 | 30 | 8 |
1 | 40 | 4 - 应该是空白 |
2 | 50 | 99 - 应该是空白 |
这是正确的方法吗?我很擅长正则表达式,但对组很模糊。谢谢你。
使用str.split
+ concat
+stack
获取数据更可用的格式:
new_df = pd.concat(
(df['a'].str.split('-', expand=True),
df['b'].str.split('-', expand=True)),
keys=('a', 'b'),
axis=1
).stack(dropna=False).droplevel(0)
new_df
:
a b
0 10 5
1 30 8
2 410 9
0 20 4
1 40 None
2 500 None
0 25 99
1 50 None
2 None None
n
cols 的可扩展选项:
cols = ['a', 'b']
new_df = pd.concat(
(df[c].str.split('-', expand=True) for c in cols),
keys=cols,
axis=1
).stack(dropna=False).droplevel(0)
然后groupby
级别 0 +reset_index
创建数据框列表:
dfs = [g.reset_index(drop=True) for _, g in new_df.groupby(level=0)]
dfs
:
[ a b
0 10 5
1 20 4
2 25 99,
a b
0 30 8
1 40 None
2 50 None,
a b
0 410 9
1 500 None
2 None None]
完整的工作示例:
import pandas as pd
df = pd.DataFrame({
'a': ["10-30-410", "20-40-500", "25-50"],
'b': ["5-8-9", "4", "99"]
})
cols = ['a', 'b']
new_df = pd.concat(
(df[c].str.split('-', expand=True) for c in cols),
keys=cols,
axis=1
).stack(dropna=False).droplevel(0)
dfs = [g.reset_index(drop=True) for _, g in new_df.groupby(level=0)]
print(dfs)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句