Nul*_*yte 12 python apply pandas
我有这样的数据帧:
df = pd.DataFrame(data={
'col0': [11, 22,1, 5]
'col1': ['aa:a:aaa', 'a:a', 'a', 'a:aa:a:aaa'],
'col2': ["foo", "foo", "foobar", "bar"],
'col3': [True, False, True, False],
'col4': ['elo', 'foo', 'bar', 'dupa']})
Run Code Online (Sandbox Code Playgroud)
我想在 col1 中的“:”上拆分后获取列表的长度,然后我想在长度 > 2 时覆盖这些值,或者在长度 <= 2 时不覆盖这些值。
理想情况下,尽可能快地排成一行。
目前,我尝试但它返回 ValueError。
df[['col1', 'col2', 'col3']] = df.loc[df['col1'].str.split(":").apply(len) > 2], ("", "", False), df[['col1', 'col2', 'col3']])
Run Code Online (Sandbox Code Playgroud)
编辑:col1 上的条件。EDIT2:感谢您提供的所有出色且快速提供的答案。惊人的!EDIT3:10^6 行计时:
@ansev 3.2657s
@jezrael 0.8922s
@anky_91 1.9511s
ank*_*_91 10
您需要series.str.len()在拆分后确定列表的长度,然后您可以比较和使用.loc[],在条件匹配的地方分配列表:
df.loc[df['col1'].str.split(":").str.len()>2,['col1','col2','col3']]=["", "", False]
print(df)
Run Code Online (Sandbox Code Playgroud)
col0 col1 col2 col3 col4
0 11 False elo
1 22 a:a foo False foo
2 1 a foobar True bar
3 5 False dupa
Run Code Online (Sandbox Code Playgroud)
使用Series.str.count、添加1、比较Series.gt和将列表分配给列表中的过滤列:
df.loc[df['col1'].str.count(":").add(1).gt(2), ['col1','col2','col3']] = ["", "", False]
print (df)
col0 col1 col2 col3 col4
0 11 False elo
1 22 a:a foo False foo
2 1 a foobar True bar
3 5 False dupa
Run Code Online (Sandbox Code Playgroud)
另一种方法是Series.str.splitwithexpand = True和DataFrame.countwith axis=1。
df.loc[df['col1'].str.split(":",expand = True).count(axis=1).gt(2),['col1','col2','col3']]=["", "", False]
print(df)
col0 col1 col2 col3 col4
0 11 False elo
1 22 a:a foo False foo
2 1 a foobar True bar
3 5 False dupa
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1191 次 |
| 最近记录: |