Pandas:解析结构化非表格文本中的值

时间:2017-02-12 03:48:42

标签: python pandas

我有一个文本文件,格式如下:

k1[a-token]
v1
v2
k2[a-token]
v1'
k3[a-token]
v1"
v2"
v3"

将这些数据读入此格式的数据框中最为便宜的方法是什么:

        A       B
0       k1      v1
1       k1      v2
2       k2      v1'
3       k3      v1"
4       k3      v2"
5       k3      v3"

不涉及手动循环?或者是否有任何其他库允许我只输入一些正则表达式来指定我的文本文件的结构并以上述表格形式输出数据?

3 个答案:

答案 0 :(得分:3)

<强> 设置
借用@jezrael

import pandas as pd
from pandas.compat import StringIO

temp=u"""
k1[a-token]
v1
v2
k2[a-token]
v1'
k3[a-token]
v1"
v2"
v3"
"""
#after testing replace 'StringIO(temp)' to 'filename.csv'
df = pd.read_csv(StringIO(temp), sep="|", names=['B'])
print (df)
  • str.extract在正则表达式中指定参数并向前看
  • 使用duplicated标识我们要保留的行。
df = df.B.str.extract('(?P<A>.*(?=\[a-token\]))?(?P<B>.*)', expand=True).ffill()
df[df.duplicated(subset=['A'])].reset_index(drop=True)

    A    B
0  k1   v1
1  k1   v2
2  k2  v1'
3  k3  v1"
4  k3  v2"
5  k3  v3"

答案 1 :(得分:1)

您可以将read_csv与某些分隔符一起使用,该分隔符不在if(Activity.getResources().getConfiguration().orientation == ORIENTATION_PORTRAIT){ getSupportFragmentManager().beginTransaction() .replace(R.id.dashboard_fragment_container, df, TAG_DASHBOARD_FRAGMENT) .commit(); } |等数据中:

¥

然后insert新列import pandas as pd from pandas.compat import StringIO temp=u""" k1[a-token] v1 v2 k2[a-token] v1' k3[a-token] v1" v2" v3" """ #after testing replace 'StringIO(temp)' to 'filename.csv' df = pd.read_csv(StringIO(temp), sep="|", names=['B']) print (df) B 0 k1[a-token] 1 v1 2 v2 3 k2[a-token] 4 v1' 5 k3[a-token] 6 v1" 7 v2" 8 v3" extractA,最后一次使用boolean indexing,屏蔽duplicated,用{删除行{ {1}}列中的{1}}:

[a-token]

但是如果文件重复keys

values

然后必须将df.insert(0, 'A', df['B'].str.extract('(.*)\[a-token\]', expand=False).ffill()) df = df[df['A'].duplicated()].reset_index(drop=True) print (df) A B 0 k1 v1 1 k1 v2 2 k2 v1' 3 k3 v1" 4 k3 v2" 5 k3 v3" 更改为:

keys

答案 2 :(得分:0)

将您的文件设为&#39; temp.txt&#39; ...

df = pd.read_csv('temp.txt',
                 header=None,
                 delim_whitespace=True,
                 names=['data'])

bins = df.data.str.endswith('[a-token]')

idx_bins = df[bins][:]
idx_bins.data = idx_bins.data.str.rstrip(to_strip='[a-token]')
idx_vals = df[~bins][:]

a = pd.DataFrame(idx_bins.index.values, columns=['a'])
b = pd.DataFrame(idx_vals.index.values, columns=['b'])

merge_df = pd.merge_asof(b, a, left_on='b', right_on='a')
new_df = pd.DataFrame({'A': idx_bins.data.loc[list(merge_df.a)].values, 
                       'B': idx_vals.data.values})