我有以下名为'data.csv'的文件:
1997,Ford,E350
1997, Ford , E350
1997,Ford,E350,"Super, luxurious truck"
1997,Ford,E350,"Super ""luxurious"" truck"
1997,Ford,E350," Super luxurious truck "
"1997",Ford,E350
1997,Ford,E350
2000,Mercury,Cougar
我想把它解析成一个pandas DataFrame,以便DataFrame看起来如下:
Year Make Model Description
0 1997 Ford E350 None
1 1997 Ford E350 None
2 1997 Ford E350 Super, luxurious truck
3 1997 Ford E350 Super "luxurious" truck
4 1997 Ford E350 Super luxurious truck
5 1997 Ford E350 None
6 1997 Ford E350 None
7 2000 Mercury Cougar None
我能做的最好的事情是:
pd.read_table("data.csv", sep=r',', names=["Year", "Make", "Model", "Description"])
哪个让我:
Year Make Model Description
0 1997 Ford E350 None
1 1997 Ford E350 None
2 1997 Ford E350 Super, luxurious truck
3 1997 Ford E350 Super "luxurious" truck
4 1997 Ford E350 Super luxurious truck
5 1997 Ford E350 None
6 1997 Ford E350 None
7 2000 Mercury Cougar None
如何在没有这些空格的情况下获取DataFrame?
答案 0 :(得分:42)
您可以使用转换器:
import pandas as pd
def strip(text):
try:
return text.strip()
except AttributeError:
return text
def make_int(text):
return int(text.strip('" '))
table = pd.read_table("data.csv", sep=r',',
names=["Year", "Make", "Model", "Description"],
converters = {'Description' : strip,
'Model' : strip,
'Make' : strip,
'Year' : make_int})
print(table)
产量
Year Make Model Description
0 1997 Ford E350 None
1 1997 Ford E350 None
2 1997 Ford E350 Super, luxurious truck
3 1997 Ford E350 Super "luxurious" truck
4 1997 Ford E350 Super luxurious truck
5 1997 Ford E350 None
6 1997 Ford E350 None
7 2000 Mercury Cougar None
答案 1 :(得分:23)
嗯,空白在你的数据中,所以你不能在不读取空格的情况下读入数据。但是,在您阅读之后,您可以通过执行此操作来删除空格,例如df["Make"] = df["Make"].map(str.strip)
(其中df
是您的数据框)。
答案 2 :(得分:19)
将参数skipinitialspace=True
添加到read_table
为我工作。
所以试试:
pd.read_table("data.csv",
sep=r',',
names=["Year", "Make", "Model", "Description"],
skipinitialspace=True)
同样适用于pd.read_csv()
。
答案 3 :(得分:9)
我没有足够的声誉来发表评论,但如果您有NaN值,上面的答案建议使用map
函数和strip
将无法工作strip仅适用于字符,NaN是浮点数。
我有一个内置的pandas功能,我用过:
pd.core.strings.str_strip(df['Description'])
其中df
是您的数据框架。就我而言,我在一个行数约为120万的数据帧上使用它并且速度非常快。
答案 4 :(得分:5)
我不相信Pandas在发布此问题时支持此功能,但最直接的方法是在sep
read_csv
参数中使用正则表达式。因此,以下内容适用于此问题。
table = pd.read_table("data.csv", sep=' *, *')
答案 5 :(得分:2)
这是一个迭代每列并应用pd.core.strings.str_strip
:
def df_strip(df):
df = df.copy()
for c in df.columns:
if df[c].dtype == np.object:
df[c] = pd.core.strings.str_strip(df[c])
df = df.rename(columns={c:c.strip()})
return df
答案 6 :(得分:2)
str.strip()函数在Series上运行得非常好。因此,我将包含空格的数据帧列转换为系列,使用str.strip()函数剥离空白,然后将转换后的列替换回数据帧。下面是示例代码。
import pandas as pd
data = pd.DataFrame({'values': [' ABC ', ' DEF', ' GHI ']})
new = pd.Series([])
new = data['values'].str.strip()
data['values'] = new
答案 7 :(得分:0)
read_table已被弃用,这是文档中显示的消息。
从0.24.0版开始不推荐使用。
请改用pandas.read_csv(),并在必要时传递sep ='\ t'。
因此,使用 read_csv ,您可以为sep
参数传入一个正则表达式,您可以在其中将分隔符指定为</ p>
sep="\s*,\s*"
任意数量的空格,后跟一个分隔符,然后再任意数量的空格,这将确保所有前导和尾随空格也都被选作分隔符块,从而依次删除数据两侧的空白。
正则表达式详细信息如下:
\s -> white-space
* -> any number (zero or many)
, -> no meaning, direct character match
因此,正则表达式\s*,\s*
代表white-space[any number] match a comma and white-space[any number]
。
如果分隔符不是逗号,则用分隔符替换以上表达式中的,
。例如:\s*;\s*
是;
的分隔符。