Python中的Hive子串等价物

时间:2017-04-25 15:15:42

标签: python pandas dataframe hive

我按以下方式在文件中包含数据行:

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,但我认为它更具体是系列而不是数据帧。

1 个答案:

答案 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 .strread_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