python - Python 中的 Hive 子字符串等效项

标签 python pandas dataframe hive

我在文件中有以下方式的数据行:

0100234567   1234567     0000603842000000000000ABCDE               JOHN           J     01F19660129 2PO BOX 999

我已经将文件中的所有行输入到 pandas 数据框中。现在我需要做的是根据字符的位置,我需要分离出特定的列。在 Hive 中,我可以做一个子字符串和输出列,但在 pandas dataframe 中我做不到。

例如:在 Hive 中,NAME 可以是 select substring(100,10) from temp;

100 是此人的 NAME 开始的位置。

我可以使用 pandas 数据框做些什么吗?任何帮助,将不胜感激。我已经尝试过 str.slice,但我认为它更特定于系列而不是数据帧。

最佳答案

我认为您需要 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

关于python - Python 中的 Hive 子字符串等效项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43614675/

相关文章:

python - scapy 没有发送数据包

python - Mysql使用变量flask进行查询

python - 在 Python 中将文本插入 raw_input(以避免读取)的跨平台方法

python - 如何在 Pandas 的循环内创建动态变量名

python - Pandas:对各种列执行操作并创建、重命名新列

Python Pandas 数据帧 read_csv UnicodeDecodeError

python - 使用 TensorArray 的梯度错误

python - 如何有效地循环此数据帧并使用内置的 numpy 或 pandas 执行函数?

带有 IntEnum 的 pandas value_counts() 引发 RecursionError

python - 如何用逗号交换名字和姓氏并添加新列?