Pandas DF:如何用分隔符(;CSV 格式)将 '-' 替换为 '_'

Posted

技术标签:

【中文标题】Pandas DF:如何用分隔符(;CSV 格式)将 \'-\' 替换为 \'_\'【英文标题】:Pandas DF : how to replace '-' by '_' with separators (; CSV format)Pandas DF:如何用分隔符(;CSV 格式)将 '-' 替换为 '_' 【发布时间】:2019-08-02 02:07:59 【问题描述】:

我需要正则表达式和正则表达式函数方面的帮助!!!我有一个用“;”分隔的 CSV 文件并且需要将 - 替换为 _。数据如下所示:

79             80;0;RueSaint_Hilaire;Locale;15-25;1;1             
80              81;0;RueSaint_Hilaire;Locale;5-10;5;5             
81                   82;0;RueTaillon;Locale;10-15;1;1             
82                   83;0;RueTanguay;Locale;10-15;2;2             
83                   84;0;RueTanguay;Locale;15-25;2;2             
84                    85;0;RueTanguay;Locale;5-10;3;3  

例如,我需要将 15-25 替换为 15_25。

到目前为止,我已经尝试过了:

df.replace('-','_', inplace=True)

或者这个:

df_obj = df.select_dtypes(['object'])
df[df_obj.columns] = df_obj.apply(lambda x: x.str.strip())
df.replace('-','_', inplace=True)
print(df)

没有任何成功。这里有任何正则表达式或替换向导可以解决这个小问题吗?

非常感谢!

【问题讨论】:

RueSaint-Hilaire 应该更改为RueSaint_Hilaire?您还希望将这些字段读入单独的列,还是您想要一个大字符串? 对不起,我的错误。名称已从以前的数据库中更正。我需要将 15-25、5-10、10-15(等等...)更改为 15_25,5_10,10_15 【参考方案1】:

这是我能想到的最简单的实现:

with open(<PATH TO FILE>, 'r') as fileIn:
    data = fileIn.read()
    print("\nOriginal data: \n", data)
    data = data.replace('-', '_')
    print("Modified data: \n", data)

这给出了:

Original data:
80,0,RueSaint-Hilaire,Locale,15-25,1,1
81,0,RueSaint-Hilaire,Locale,10-May,5,5

Modified data:
80,0,RueSaint_Hilaire,Locale,15_25,1,1
81,0,RueSaint_Hilaire,Locale,10_May,5,5

【讨论】:

【参考方案2】:

如果您需要在数字之间专门更改您的-,请选择:

import re

regex = r"(\d+)-(\d+)"

test_str = ("79             80;0;RueSaint_Hilaire;Locale;15-25;1;1         \n"
    "80              81;0;RueSaint_Hilaire;Locale;5-10;5;5         \n"
    "81                   82;0;RueTaillon;Locale;10-15;1;1         \n"
    "82                   83;0;RueTanguay;Locale;10-15;2;2         \n"
    "83                   84;0;RueTanguay;Locale;15-25;2;2         \n"
    "84                    85;0;RueTanguay;Locale;5-10;3;3  ")

subst = "$1_$2"

# You can manually specify the number of replacements by changing the 4th argument
result = re.sub(regex, subst, test_str, 0, re.MULTILINE)

if result:
    print (result)

您可以在此处查看正则表达式:https://regex101.com/r/DGrm7V/1

【讨论】:

【参考方案3】:

默认为regex=False。因此,使用您现有的代码使用正则表达式替换为regex=Trueinplace=True。见replace

df.replace('-', '_',regex=True, inplace=True)
print(df)

【讨论】:

我只是错过了 regex=True 参数。感谢您指出这一点! 是的,这就是为什么我也为您添加了 replace 手册。希望这会有所帮助【参考方案4】:

这里有一个关于 pandas 的很好的常见问题解答:https://***.com/tags/pandas/info

将 lambda 应用于数据框,如下所示:

df['foo'] = df['foo'].apply(lambda x: x.replace('_', '-'))

【讨论】:

【参考方案5】:

通常,我会选择:

df['Col'] = df['Col'].str.replace('-', '_')

【讨论】:

以上是关于Pandas DF:如何用分隔符(;CSV 格式)将 '-' 替换为 '_'的主要内容,如果未能解决你的问题,请参考以下文章

你如何用 awk 解析逗号分隔值(csv)?

使用 pandas 的 df.to_csv 方法不适用于空格作为分隔符

如何用Java解析CSV文件

如何用vb修改csv文件

为啥 pandas to_csv 逗号分隔不起作用?

pandas读写CSV操作