首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在字符串上有条件地拆分列

在字符串上有条件地拆分列
EN

Stack Overflow用户
提问于 2022-05-17 08:33:24
回答 2查看 34关注 0票数 1

我有一个具有以下形状的数据框架:

代码语言:javascript
复制
    0   1
0   OTT:81  DVBC:398
1   OTT:81  DVBC:474
2   OTT:81  DVBC:474
3   OTT:81  DVBC:454
4   OTT:81  DVBC:443
5   OTT:1   DVBC:254
6   DVBC:151    None
7   OTT:1   DVBC:243
8   OTT:1   DVBC:254
9   DVBC:227    None

如果第1栏包含"DVBC“,我希望第1栏与第0栏相同。将":“上的值拆分,并用0填充空值。终端数据框架应该如下所示

代码语言:javascript
复制
    OTT DVBC
0   81  398
1   81  474
2   81  474
3   81  454
4   81  443
5   1   254
6   0   151
7   1   243
8   1   254
9   0   227

我试着从以下几个方面开始:

代码语言:javascript
复制
if df[0].str.contains("DVBC") is True:
    df[1] = df[0]

但在此之后,数据框架看起来是一样的,但不确定原因。我的想法是将值传递给相应的列,然后按":“拆分并重命名这些列。我如何实现这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-05-17 08:37:28

通过:和枢轴分割值的通用解决方案--先由DataFrame.stack创建Series,然后由Series.str.splitSeries.str.rsplit拆分,最后由DataFrame.pivot重新塑造

代码语言:javascript
复制
df = df.stack().str.split(':', expand=True).reset_index()

df = df.pivot('level_0',0,1).fillna(0).rename_axis(index=None, columns=None)
print (df)
  DVBC OTT
0  398  81
1  474  81
2  474  81
3  454  81
4  443  81
5  254   1
6  151   0
7  243   1
8  254   1
9  227   0
票数 0
EN

Stack Overflow用户

发布于 2022-05-17 08:37:37

以下是处理任意数量的列的一种方法:

代码语言:javascript
复制
(df
 .apply(lambda c: c.str.extract(':(\d+)', expand=False))
 .ffill(axis=1)
 .mask(df.replace('None', pd.NA).isnull().shift(-1, axis=1, fill_value=False), 0)
)

产出:

代码语言:javascript
复制
    OTT   DVBC
0    81   398
1    81   474
2    81   474
3    81   454
4    81   443
5     1   254
6     0   151
7     1   243
8     1   254
9     0   227
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72270689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档