潘达斯Python|在特定位置包含特定值

bsxbgnwa  于 2023-03-11  发布在  Python
关注(0)|答案(3)|浏览(172)

我尝试只选择列“Cuenta”中第三和第四个位置包含“05”的行,例如:510503时,510506时
| 阿尼奥|佩里奥多|昆塔|
| - ------|- ------|- ------|
| 二○二三|1个|小行星51050|
| 二○二三|第二章|小行星510539|
| 二○二三|1个|小行星7435|
| 二○二三|第二章|小行星7445|
| 二○二三|六个|小行星51050|
| 二○二三|七|小行星510506|
| 二○二三|七|小行星5235|
| 二○二三|七|小行星5235|
| 二○二三|七|小行星5215|
我用这个代码:

pattern=r'..05*' 

df[df['Cuenta'].str.contains(pattern)]

但是它不起作用,我怎么能做呢?

bxpogfeg

bxpogfeg1#

你必须改变你的模式:

pattern = '^..05'  # ^ means from the begin string

>>> df['Cuenta'].astype(str).str.contains(pattern)
0     True
1     True
2    False
3    False
4     True
5     True
6    False
7    False
8    False
Name: Cuenta, dtype: bool
ltskdhd1

ltskdhd12#

或者像这样:

df[df['Cuenta'].astype(str).str[2:4] == '05']

输出:

Año  Periodo    Cuenta
0  2023        1  51050300
1  2023        2  51053900
4  2023        6  51050300
5  2023        7  51050600
aiqt4smr

aiqt4smr3#

有趣的是,假设一个整型列,算术解为:

m = df['Cuenta'].floordiv(10**(np.ceil(np.log10(df['Cuenta'])-1)-3)).mod(100).eq(5)
out = df.loc[m]

或者,如果位数是固定的:

m = df['Cuenta']//10000%100 == 5

工作原理:

df.assign(n_digits=np.ceil(np.log10(df['Cuenta'])-1)+1,
          first_4=lambda d: d['Cuenta'].floordiv(10**(d['n_digits']-4)),
          digits_3_4=lambda d: d['first_4'].mod(100)
         )

    Año  Periodo    Cuenta  n_digits  first_4  digits_3_4
0  2023        1  51050300       8.0   5105.0         5.0
1  2023        2  51053900       8.0   5105.0         5.0
2  2023        1  74359570       8.0   7435.0        35.0
3  2023        2  74452500       8.0   7445.0        45.0
4  2023        6  51050300       8.0   5105.0         5.0
5  2023        7  51050600       8.0   5105.0         5.0
6  2023        7  52351005       8.0   5235.0        35.0
7  2023        7  52353505       8.0   5235.0        35.0
8  2023        7  52159500       8.0   5215.0        15.0
9  2024        8     12051       5.0   1205.0         5.0

相关问题