python—从一列划分为三列的 Dataframe

kqhtkvqz  于 2021-09-08  发布在  Java
关注(0)|答案(2)|浏览(274)

想把钥匙分开吗 'a' 价值来自 ['11 - 18 [1.3'] 进入 'a1': ['11' ,'12','13','14','8'] 'a2': ['18' ,'17','18','16','48'] 'a3': ['1.3' ,'2.8','3.3','4.7','5.4'] 此格式的引用正则表达式
regexr.com/61kpi
regexr.com/61kpo
数据

x = {'a': ['11 - 18 [1.3]','12 - 17 [2.8]','13 - 18 [3.3]','14 - 16 [4.7]','8 - 48 [5.3]'],
 'b': [13.0, 11.0, 12.0, 14.0, 15.0]}

打印数据

a     b
0  11 - 18 [1.3]  13.0
1  12 - 17 [2.8]  11.0
2  13 - 18 [3.3]  12.0
3  14 - 16 [4.7]  14.0
4   8 - 48 [5.3]  15.0

预期结果

a1 a2   a3     b
0  11  18  1.3  13.0
1  12  17  2.8  11.0
2  13  18  3.3  12.0
3  14  16  4.7  14.0
4   8  48  5.3  15.0

预期输出数据

y = {'a1': ['11' ,'12','13','14','8'],'a2': ['18' ,'17','18','16','48'], 'a3': ['1.3' ,'2.8','3.3','4.7','5.3'], 'b': [13.0, 11.0, 21.0, 13.0, 17.0]}
0s0u357o

0s0u357o1#

正则表达式将是实现这一目标的最佳方法:
使用 .str.extract 使用命名的捕获组:

pattern = r"(?P<a1>\d+) - (?P<a2>\d+) \[(?P<a3>\d\.\d)\]"

new_df = df["a"].str.extract(pattern).join(df["b"])

print(new_df)
   a1  a2   a3     b
0  11  18  1.3  13.0
1  12  17  2.8  11.0
2  13  18  3.3  12.0
3  14  16  4.7  14.0
4   8  48  5.3  15.0

使用 .str.extractall 要在 Dataframe 中的模式不一致的情况下获取所有数字,请执行以下操作:

new_df = (
    df["a"].str.extractall(r"(\d+\.?\d*)")[0]
    .unstack()
    .rename(columns=lambda c: "a{}".format(c+1))
    .join(df["b"])
)

print(new_df)
   a1  a2   a3     b
0  11  18  1.3  13.0
1  12  17  2.8  11.0
2  13  18  3.3  12.0
3  14  16  4.7  14.0
4   8  48  5.3  15.0
xkftehaa

xkftehaa2#

您可以使用正则表达式将文本拆分为新列,然后将字符串转换为数字,例如:

x = {'a': ['11 - 18 [1.3]','12 - 17 [2.8]','13 - 18 [3.3]','14 - 16 [4.7]','8 - 48 [5.3]'],
 'b': [13.0, 11.0, 12.0, 14.0, 15.0]}

df = pd.DataFrame(x)
df[['a1', 'a2']] = df['a'].str.split(' - ', expand=True)
df[['a2', 'a3']] = df['a2'].str.split(' \[', expand=True)
df['a3'] = df['a3'].str.replace(']', '')
df[['a1', 'a2', 'a3']] = df[['a1', 'a2', 'a3']].astype(float)

得到:

a     b    a1    a2   a3
0  11 - 18 [1.3]  13.0  11.0  18.0  1.3
1  12 - 17 [2.8]  11.0  12.0  17.0  2.8
2  13 - 18 [3.3]  12.0  13.0  18.0  3.3
3  14 - 16 [4.7]  14.0  14.0  16.0  4.7
4   8 - 48 [5.3]  15.0   8.0  48.0  5.3

相关问题