Python Pandas 过滤和创建新的数据框

标签 python csv pandas

我正在过滤列表以查找在一列中包含关键字的记录。总体列表,输出如下:

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/

相关文章:

database - 查看非常大的 CSV 文件?

python - Pandas python 如何使用另一个 DF 作为条件来分割 DataFrame

python - Pandas:根据确切的 ID 和最近的日期进行合并

python - 给出内部服务器错误的基本 python 脚本

python - 如何使用 python API 保存/显示 giphy gif?

python - matplotlib 图表中感兴趣的阴影区域

regex - Vim 正则表达式 : overwritten back references?

Excel 保存不带空格的 CSV

python - 在 Spyder 控制台中记录输入和输出

python - 在 Sublime Text 3 中使用 wxPython