如何根据 Python 中列的字符串长度对数据框中的字符串进行切片?

How to slice strings in dataframe based on string length of column in Python?

我要解决的问题是:在一列上使用Len(),每行的字符数需要应用到另一列。

我有一个总帐代码长度不同的数据框,我需要找到最低级别的详细信息以防止重复计算。我找到它的方法是使用当前行的字符数将当前行的数字与下一行的数字进行比较。 例如,11.0 和 111.0 是 1111-1123 的分组帐户。我只想要111-1123,排除群号。

我可以使用 LEN 函数获取当前行的字符数,但我无法将其应用于整列。

我的数据框如下所示:

:
df3

    Account    Amount 
0      11.0   1000.82         
1     111.0   1000.42         
2    1111.0    791.51       
3    1115.0   1802.19       
4    1116.0    202.36      
5    1117.0   1507.33      
6    1118.0      0.03      
7    1119.0      0.00      
8    1120.0      0.00      
9    1121.0     24.28      
10   1122.0    376.87      
11   1123.0      0.25      
14     12.0  80179.92      
15    121.0  80179.92      
16  12101.0      0.00      

我尝试通过为下一行添加一个新列,为当前行的字符长度添加一个新列来计算。

df3['Next_Account'] = df3['Account'].shift(-1)
df3['Len_account'] = df3['Account'].str.len()-2

    Account    Amount Next_account  Len_Account  
0      11.0   1000.82        111.0            2   
1     111.0   1000.42       1111.0            3      
2    1111.0    791.51       1115.0            4     
3    1115.0   1802.19       1116.0            4      
4    1116.0    202.36       1117.0            4      
5    1117.0   1507.33       1118.0            4      
6    1118.0      0.03       1119.0            4       
7    1119.0      0.00       1120.0            4        
8    1120.0      0.00       1121.0            4        
9    1121.0     24.28       1122.0            4        
10   1122.0    376.87       1123.0            4       
11   1123.0      0.25         12.0            4          
14     12.0  80179.92        121.0            2        
15    121.0  80179.92      12101.0            3        
16  12101.0      0.00      12102.0            5        
      

我尝试使用字符串函数获取下一个帐户的字符数,但由于某些原因这不起作用。

df3['current_digits_next'] = df3['Next_Account'].str[:df3['Len_Account']]
df3

    current_digits_next  
0                   NaN  
1                   NaN  
2                   NaN  
3                   NaN  
4                   NaN  
5                   NaN  
6                   NaN  
7                   NaN  
8                   NaN  
9                   NaN  
10                  NaN  
11                  NaN  
14                  NaN  
15                  NaN  
16                  NaN  

首选输出是:

    current_digits_next  
0                   11  
1                   111  
2                   1115  
3                   1116 
4                   1117 
5                   1118 
6                   1119 
7                   1120 
8                   1121 
9                   1122 
10                  1123  
11                  12.0  
14                  12  
15                  121  
16                  12102  

使用首选输出,我可以匹配数据并排除分组帐户。 我做错了什么?

str 访问器接受 int 而不是 Series 作为索引。您可以尝试 apply

df3['current_digits_next'] = df3.apply(lambda row: str(row['Next_Account'])[:row['Len_account']], axis=1)
    Account    Amount Next_Account  Len_account current_digits_next
0      11.0   1000.82        111.0            2                  11
1     111.0   1000.42       1111.0            3                 111
2    1111.0    791.51       1115.0            4                1115
3    1115.0   1802.19       1116.0            4                1116
4    1116.0    202.36       1117.0            4                1117
5    1117.0   1507.33       1118.0            4                1118
6    1118.0      0.03       1119.0            4                1119
7    1119.0      0.00       1120.0            4                1120
8    1120.0      0.00       1121.0            4                1121
9    1121.0     24.28       1122.0            4                1122
10   1122.0    376.87       1123.0            4                1123
11   1123.0      0.25         12.0            4                12.0
12     12.0  80179.92        121.0            2                  12
13    121.0  80179.92      12101.0            3                 121

您可以将 Account 字段转换为字符串,然后使用 apply 检查所需条件

s1 = df['Account'].astype(int).astype(str)
s2 = df['Account'].astype(int).astype(str).shift(-1)
s3 = pd.concat([s1, s2], axis=1, ignore_index=True).loc[:len(s1), :].apply(lambda x: x[0] in x[1], axis=1)
df = pd.concat([df, s3], axis=1).fillna(False)
print(df)
    Account    Amount      0
0      11.0   1000.82   True
1     111.0   1000.42   True
2    1111.0    791.51  False
3    1115.0   1802.19  False
4    1116.0    202.36  False
5    1117.0   1507.33  False
6    1118.0      0.03  False
7    1119.0      0.00  False
8    1120.0      0.00  False
9    1121.0     24.28  False
10   1122.0    376.87  False
11   1123.0      0.25  False
14     12.0  80179.92   True
15    121.0  80179.92   True
16  12101.0      0.00  False