如何根据 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
我要解决的问题是:在一列上使用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