我有一个文本文件,格式如下:
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"
不涉及手动循环?或者是否有任何其他库允许我只输入一些正则表达式来指定我的文本文件的结构并以上述表格形式输出数据?
答案 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"
extract
值A
,最后一次使用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})