我按以下方式在文件中包含数据行:
0100234567 1234567 0000603842000000000000ABCDE JOHN J 01F19660129 2PO BOX 999
我已经在pandas数据帧中输入了文件中的所有行。现在我需要做的是根据角色的位置,我需要分离出特定的列。在Hive中,我可以做一个子串和输出列,但在pandas数据帧中我无法做到。
例如:在Hive中,NAME
可以是select substring(100,10) from temp;
100
是此人NAME
开始的位置。
使用pandas数据框我能做些什么吗?任何帮助,将不胜感激。我已经尝试过str.slice,但我认为它更具体是系列而不是数据帧。
答案 0 :(得分:1)
我认为您需要read_fwf
,可以使用参数colspecs
或继承前100行:
df = pd.read_fwf('filename')
可以使用自定义名称:
df = pd.read_fwf('filename', names=list('abcdefghi'))
更好的解释是Files with Fixed Width Columns。
样品:
import pandas as pd
from pandas.compat import StringIO
temp=u"""0100234567 1234567 0000603842000000000000ABCDE JOHN J 01F19660129 2PO BOX 999
0100234567 1234567 0000603842000000000000ABCDE JOHN J 01F19660129 2PO BOX 999
0100234567 1234567 0000603842000000000000ABCDE JOHN J 01F19660129 2PO BOX 999"""
#after testing replace 'StringIO(temp)' to 'filename.csv'
df = pd.read_fwf(StringIO(temp), names=list('abcdefghi'))
print (df)
a b c d e f g \
0 100234567 1234567 0000603842000000000000ABCDE JOHN J 01F19660129 2PO
1 100234567 1234567 0000603842000000000000ABCDE JOHN J 01F19660129 2PO
2 100234567 1234567 0000603842000000000000ABCDE JOHN J 01F19660129 2PO
h i
0 BOX 999
1 BOX 999
2 BOX 999
print (type(df))
<class 'pandas.core.frame.DataFrame'>
但是,如果只需按职位使用值indexing with .str,read_csv
需要not
或|
等数据¥
的分隔符:
import pandas as pd
from pandas.compat import StringIO
temp=u"""0100234567 1234567 0000603842000000000000ABCDE JOHN J 01F19660129 2PO BOX 999
0100234567 1234567 0000603842000000000000ABCDE JOHN J 01F19660129 2PO BOX 999
0100234567 1234567 0000603842000000000000ABCDE JOHN J 01F19660129 2PO BOX 999"""
#after testing replace 'StringIO(temp)' to 'filename.csv'
df = pd.read_csv(StringIO(temp), names= ['col'], sep='|')
print (df)
col
0 0100234567 1234567 000060384200000000000...
1 0100234567 1234567 000060384200000000000...
2 0100234567 1234567 000060384200000000000...
df['a'] = df['col'].str[7:10]
df['b'] = df['col'].str[15:20]
df = df.drop('col', axis=1)
print (df)
a b
0 567 34567
1 567 34567
2 567 34567