根据字符串条件拆分列

Split columns conditionally on string

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

    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 填充空值。 结束数据框应该是这样的

    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

我尝试从以下开始:

if df[0].str.contains("DVBC") is True:
    df[1] = df[0]

但在此之后数据框看起来一样,不知道为什么。 我的想法是将值传递给各个列,然后用“:”分割并重命名列。 我该如何实施?

通过 : 和旋转的拆分值的通用解决方案-首先通过 DataFrame.stack, split by Series.str.splitSeries.str.rsplit and last reshape by DataFrame.pivot 创建 Series:

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

这是一种适用于任意数量列的方法:

(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)
)

输出:

    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