我正在过滤列表以查找在一列中包含关键字的记录。总体列表,输出如下:
outputs =
sent_name Name Lat Lng type
Abbey Road Station, London, UK Abbey Road, London E15, UK 51.53193 0.00376 [u'transit_station', u'point_of_interest', u'establishment']
Abbey Wood Station, London, UK Abbey Wood, London SE2, UK 51.49106 0.12142 [u'transit_station', u'point_of_interest', u'establishment']
我在输出[3]中搜索字符串“station”,然后将符合条件的结果附加到空列表 results.txt 中。根据 -
results = []
for output in outputs:
if "station" in output[3]:
results.append(output)
我希望使用 Pandas 进行将来的分析,但不知道如何在过滤这些结果后重新创建 DataFrame。
OD = pd.read_csv('./results.csv', header=0)
结果.csv 又在哪里:
sent_name Name Lat Lng type
Abbey Road Station, London, UK Abbey Road, London E15, UK 51.53193 0.00376 [u'transit_station', u'point_of_interest', u'establishment']
Abbey Wood Station, London, UK Abbey Wood, London SE2, UK 51.49106 0.12142 [u'transit_station', u'point_of_interest', u'establishment']
使用 iterrows,我可以迭代 pandas 数据框中的行并过滤掉类型列中存在“station”的行。
for index, row in OD.iterrows():
if "station" in row['type']:
但是,我无法由此创建新的 DataFrame。我的最终目标是使用 Pandas 中的 .to_csv 函数创建一个新的 csv(仅包含类型列中包含“station”的记录)。
我尝试创建一个具有适当索引名称的新数据框。然后按照上面的方法进行过滤并尝试将这些结果附加到新的数据帧
OD_filtered = pd.DataFrame(index=['sent_name','Name','Lat', 'Lng', 'type'])
for index, row in OD.iterrows():
if "station" in row['type']:
OD_filtered.append([row['sent_name'], row['Name'], row['Lat'], row['Lng'], row['type']])
pprint(OD_filtered)
但是,这无法写入数据帧并且它仍然为空。当我打印(OD_filtered)时,它给出:
Empty DataFrame
Columns: []
Index: [sent_name, Name, Lat, Lng, type]
最佳答案
您可以通过在“type”列上调用apply
来创建 bool 掩码来创建新的 df:
In [37]:
import io
import pandas as pd
t="""sent_name;Name;Lat;Lng;type
Abbey Road Station, London, UK;Abbey Road, London E15, UK;51.53193;0.00376;[u'transit_station', u'point_of_interest', u'establishment']
Abbey Wood Station, London, UK;Abbey Wood, London SE2, UK;51.49106;0.12142;[u'transit_station', u'point_of_interest', u'establishment']"""
df = pd.read_csv(io.StringIO(t), sep=';')
df
Out[37]:
sent_name Name Lat \
0 Abbey Road Station, London, UK Abbey Road, London E15, UK 51.53193
1 Abbey Wood Station, London, UK Abbey Wood, London SE2, UK 51.49106
Lng type
0 0.00376 [u'transit_station', u'point_of_interest', u'e...
1 0.12142 [u'transit_station', u'point_of_interest', u'e...
In [39]:
# filter the df
df[df['type'].apply(lambda x: 'station' in x)]
Out[39]:
sent_name Name Lat \
0 Abbey Road Station, London, UK Abbey Road, London E15, UK 51.53193
1 Abbey Wood Station, London, UK Abbey Wood, London SE2, UK 51.49106
Lng type
0 0.00376 [u'transit_station', u'point_of_interest', u'e...
1 0.12142 [u'transit_station', u'point_of_interest', u'e...
因此,在您的情况下,以下内容应该有效:
new_df = OD[OD['type'].apply(lambda x: 'station' in x)]
关于Python Pandas 过滤和创建新的数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32371880/