[python] 팬더는 한 열의 값 조건에 따라 여러 열의 값을 한 번에 덮어 씁니다.

나는 그러한 DataFrame을 가지고있다 :

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']})

col1에서 “:”로 분할 한 후 목록의 길이를 얻고 싶습니다. 길이가 2보다 크면 값을 덮어 쓰거나 길이가 2보다 작 으면 값을 덮어 쓰지 않습니다.

이상적으로는 가능한 한 빠른 속도로 한 줄에 있어야합니다.

현재 시도하지만 ValueError를 반환합니다.

df[['col1', 'col2', 'col3']] = df.loc[df['col1'].str.split(":").apply(len) > 2], ("", "", False), df[['col1', 'col2', 'col3']])

편집 : col1의 조건. EDIT2 : 훌륭하고 신속하게 제공된 모든 답변에 감사드립니다. 놀랄 만한! EDIT3 : 10 ^ 6 행의 타이밍 :

@ansev 3.2657s

@jezrael 0.8922s

@ anky_91 1.9511s



답변

사용 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


답변

당신이 필요로하는 series.str.len()다음 비교할 수,리스트의 길이를 결정하고 사용하는 분할 이후 .loc[]의 목록 곳 조건이 일치 지정 :

df.loc[df['col1'].str.split(":").str.len()>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


답변

또 다른 방법은 Series.str.splitexpand = TrueDataFrame.count함께 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


답변