我有一组10条python列表,格式如下:
[ABC*DEF*123>~123*999*HHH]
[PQR*RST*567>~AWS*999*POI]
[XYZ*TGT*234>~2352*245*HFT]
[STU*DEF*789>~654*345*QQQ]我试图从上面的列表中提取数据,这样最后的输出就是Dataframe,期望下面的输出
123,999,HHH
AWS,999,POI
2352,245,HFT
654,345,QQQ以下是我迄今所做的工作:
allFiles = Path where all the txt files are stored
list_ = []
for file_ in allFiles:
with open(file_) as fp:
lines1 = fp.read().split('\n')
b = [i.split('~', 1)[1] for i in lines1]
print(b)以上所列的清单如下:
[123*999*HHH]
[AWS*999*POI]
[2352*245*HFT]
[654*345*QQQ]我无法使用分隔符(*)提取上述数据,并将其拆分为不同的列,并将其保存到Dataframe中。
发布于 2019-03-15 12:34:52
因为,您已经有了列表,所以一个简单的函数可以在分隔符(*)上拆分。
l1 = ["123*999*HHH"]
l2 = ["AWS*999*POI"]
l3 = ["2352*245*HFT"]
l4 = ["654*345*QQQ"]
def split_delim(l):
for i in l:
l = i.split('*')
return l
l1 = split_delim(l1)
l2 = split_delim(l2)
l3 = split_delim(l3)
df = pd.DataFrame({'l1':l1, 'l2':l2, 'l3':l3})
df
l1 l2 l3
0 123 AWS 2352
1 999 999 245
2 HHH POI HFT一种与列表数量无关的更广义的解决方案。这将在形成数据帧之前执行所有拆分操作。
#allFiles = Path where all the txt files are stored
def split_delim(Files):
list_ = []
for file_ in Files:
with open(file_) as fp:
lines1 = fp.read().split('\n')
b = [i.split('~', 1)[1] for i in lines1]
for i in b:
l = i.split('*')
list_.append(l)
return list_
list_new = split_delim(allFiles)
df = pd.DataFrame(list_new, columns=['col1'])发布于 2019-03-15 12:35:03
使用read_csv和分隔符~,参数names,然后为DataFrame的第二列添加Series.str.split
import pandas as pd
temp=u"""ABC*DEF*123>~123*999*HHH
PQR*RST*567>~AWS*999*POI
XYZ*TGT*234>~2352*245*HFT
STU*DEF*789>~654*345*QQQ"""
#after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv'
df = pd.read_csv(pd.compat.StringIO(temp), sep="~", names=['a','b'])
df = df['b'].str.split('*', expand=True)
print (df)
0 1 2
0 123 999 HHH
1 AWS 999 POI
2 2352 245 HFT
3 654 345 QQQ如果要使用您的解决方案,请添加另一个split
list_ = []
for file_ in allFiles:
with open(file_) as fp:
lines1 = fp.read().split('\n')
b = [i.split('~', 1)[1].split('*') for i in lines1]
list_.append(b)
df = pd.DataFrame([y for x in list_ for y in x])
print(df)发布于 2019-03-15 12:35:33
您必须显式地指定分隔符,例如
print('ABC*DEF*123>~123*999*HHH'.split('~')[1].split('*'))生产:
['123', '999', 'HHH']https://stackoverflow.com/questions/55182614
复制相似问题