python pandas 中有没有办法像 excel 中那样按位置(而不是分隔符)执行 "Text to Columns"?
Is there a way in python pandas to do "Text to Columns" by location (not by a delimiter) like in excel?
我使用的是来自国务卿的投票历史数据,但是他们给我的 .txt 文件有 700 万行,其中每行都是一个包含 27 个字符的字符串。前 3 个字符是县的代码。接下来的 8 个字符是注册 ID,接下来的 8 个字符是投票日期,等等。我无法对 excel 中的列进行文本处理,因为文件太大了。有没有办法将此文件分成 python pandas 中的列?
示例
目前我有:
0010000413707312012026R
0010000413708212012027R
0010000413711062012029
0010004535307312012026D
我想要列:
001 00004137 07312012 026 R
001 00004137 08212012 027 R
001 00004137 11062012 029
001 00045353 07312012 026 D
其中每个 space 分隔一个新列。有什么建议么?谢谢。
由于文件太大,最好读取并保存到不同的文件中,而不是读取内存中的整个文件:
with open('temp.csv') as f:
for line in f:
code = line[0:3]
registration = line[3:11]
date = line[11:19]
second_code = line[19:22]
letter = line[22:]
with open('modified.csv', 'a') as f2:
f2.write(
' '.join([code, registration, date, second_code, letter]))
也可以从txt文件中读取内容,使用extract
划分dataframe列
df = pd.read_csv('temp.csv', header=None)
df
# 0
# 0 0010000413707312012026R
# 1 0010000413708212012027R
# 2 0010000413711062012029
# 3 0010004535307312012026D
df = df[df.columns[0]].str.extract('(.{3})(.{8})(.{8})(.{3})(.*)')
df
# 0 1 2 3 4
# 0 001 00004137 07312012 026 R
# 1 001 00004137 08212012 027 R
# 2 001 00004137 11062012 029
# 3 001 00045353 07312012 026 D
试试这个:
我认为您在阅读表格 txt
文件时没有问题,简化情况如下所示:
a=['0010000413707312012026R','0010000413708212012027R','0010000413711062012029','0010004535307312012026D']
area=[]
date=[]
e1=[]
e2=[]
e3=[]
#001 00004137 07312012 026 R
for i in range (0,len(a)):
area.append(a[i][0:3])
date.append(a[i][3:11])
e1.append(a[i][11:19])
e2.append(a[i][19:22])
e3.append(a[i][22:23])
all_list = pd.DataFrame(
{'area': area,
'date': date,
'e1': e1,
'e2': e2,
'e3': e3
})
print(all_list )
#save as CSV file
all_list.to_csv('all.csv')
我能做到的最简单的:
import pandas as pd
sample_lines = ['0010000413707312012026R','0010000413708212012027R','0010000413711062012029','0010004535307312012026D]']
COLUMN_NAMES = ['A','B','C','D','E']
df = pd.DataFrame(columns=COLUMN_NAMES)
for line in sample_lines:
row = [line[0:3], line[3:11], line[11:19], line[19:22], line[22:23]]
df.loc[len(df)] = row
print (df)
输出:
A B C D E
0 001 00004137 07312012 026 R
1 001 00004137 08212012 027 R
2 001 00004137 11062012 029
3 001 00045353 07312012 026 D
我使用的是来自国务卿的投票历史数据,但是他们给我的 .txt 文件有 700 万行,其中每行都是一个包含 27 个字符的字符串。前 3 个字符是县的代码。接下来的 8 个字符是注册 ID,接下来的 8 个字符是投票日期,等等。我无法对 excel 中的列进行文本处理,因为文件太大了。有没有办法将此文件分成 python pandas 中的列?
示例
目前我有:
0010000413707312012026R
0010000413708212012027R
0010000413711062012029
0010004535307312012026D
我想要列:
001 00004137 07312012 026 R
001 00004137 08212012 027 R
001 00004137 11062012 029
001 00045353 07312012 026 D
其中每个 space 分隔一个新列。有什么建议么?谢谢。
由于文件太大,最好读取并保存到不同的文件中,而不是读取内存中的整个文件:
with open('temp.csv') as f:
for line in f:
code = line[0:3]
registration = line[3:11]
date = line[11:19]
second_code = line[19:22]
letter = line[22:]
with open('modified.csv', 'a') as f2:
f2.write(
' '.join([code, registration, date, second_code, letter]))
也可以从txt文件中读取内容,使用extract
划分dataframe列
df = pd.read_csv('temp.csv', header=None)
df
# 0
# 0 0010000413707312012026R
# 1 0010000413708212012027R
# 2 0010000413711062012029
# 3 0010004535307312012026D
df = df[df.columns[0]].str.extract('(.{3})(.{8})(.{8})(.{3})(.*)')
df
# 0 1 2 3 4
# 0 001 00004137 07312012 026 R
# 1 001 00004137 08212012 027 R
# 2 001 00004137 11062012 029
# 3 001 00045353 07312012 026 D
试试这个:
我认为您在阅读表格 txt
文件时没有问题,简化情况如下所示:
a=['0010000413707312012026R','0010000413708212012027R','0010000413711062012029','0010004535307312012026D']
area=[]
date=[]
e1=[]
e2=[]
e3=[]
#001 00004137 07312012 026 R
for i in range (0,len(a)):
area.append(a[i][0:3])
date.append(a[i][3:11])
e1.append(a[i][11:19])
e2.append(a[i][19:22])
e3.append(a[i][22:23])
all_list = pd.DataFrame(
{'area': area,
'date': date,
'e1': e1,
'e2': e2,
'e3': e3
})
print(all_list )
#save as CSV file
all_list.to_csv('all.csv')
我能做到的最简单的:
import pandas as pd
sample_lines = ['0010000413707312012026R','0010000413708212012027R','0010000413711062012029','0010004535307312012026D]']
COLUMN_NAMES = ['A','B','C','D','E']
df = pd.DataFrame(columns=COLUMN_NAMES)
for line in sample_lines:
row = [line[0:3], line[3:11], line[11:19], line[19:22], line[22:23]]
df.loc[len(df)] = row
print (df)
输出:
A B C D E
0 001 00004137 07312012 026 R
1 001 00004137 08212012 027 R
2 001 00004137 11062012 029
3 001 00045353 07312012 026 D