นุ่นเขียนทับค่าในหลายคอลัมน์พร้อมกันตามเงื่อนไขของค่าในหนึ่งคอลัมน์


11

ฉันมี 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 แล้วฉันต้องการเขียนทับค่าถ้า length> 2 หรือไม่เขียนทับค่าถ้า length <= 2

จะเป็นการดีในหนึ่งบรรทัดที่รวดเร็วที่สุด

ขณะนี้ฉันลองแล้ว แต่จะส่งคืน ValueError

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

แก้ไข: เงื่อนไขใน col1 แก้ไข 2: ขอบคุณสำหรับคำตอบที่ยอดเยี่ยมและให้อย่างรวดเร็วทั้งหมด ! ที่น่าตื่นตาตื่นใจ EDIT3: เวลาใน 10 ^ 6 แถว:

@ansev 3.2657 วินาที

@jezrael 0.8922 วินาที

@ anky_91 1.9511 วินาที


เป็นเงื่อนไขcol2หรือcol1ไม่?
anishtain4

ฉันขอโทษสำหรับความผิดพลาด มันคือ col1
dkrynicki

คำตอบ:


8

ใช้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

2
นี่คือคำตอบที่ดีที่สุดเท่าที่มันจะไม่จัดเก็บแยกชั่วคราว แต่ทำไมไม่ใช้gt(1)แทนการเพิ่มที่ 1 และgt(2)?
anishtain4

@ anishtain4 - yop, เห็นด้วย
jezrael

10

คุณต้องการ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

5

อีกวิธีหนึ่งคือSeries.str.splitมีexpand = TrueและมีDataFrame.countaxis=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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.