根据字符串条件拆分列
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.split
Series.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
我有一个具有以下形状的数据框:
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.split
Series.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