【问题标题】:Python Pandas filtering and creating new dataframePython Pandas 过滤和创建新数据框
【发布时间】:2015-09-03 09:30:10
【问题描述】:

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

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']

我在 output[3] 中搜索字符串“station”,然后将结果为 true 的结果附加到一个空列表 results。根据 -

results = []

for output in outputs:
    if "station" in output[3]:
        results.append(output)

我希望使用 Pandas 进行未来分析,但不知道如何在过滤这些结果后重新创建 DataFrame。

OD = pd.read_csv('./results.csv', header=0)

在哪里,results.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 数据框中的行并过滤掉类型列中存在“站”的行。

    for index, row in OD.iterrows():
        if "station" in row['type']:

但是,我无法从中创建新的 DataFrame。我的最终目标是使用 Pandas 中的 .to_csv 函数创建一个新的 csv(仅包含在类型列中包含“站”的记录)。

我尝试创建一个具有适当索引名称的新数据框。然后像上面一样过滤并尝试将这些结果附加到新的数据帧中

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]

【问题讨论】:

  • 你的 read_csv 代码不应该工作,因为你的 csv 有多个逗号,但除此之外你应该能够做到 new_df = OD[OD.apply(lambda x: 'station' in x['type'], axis=1)] 我认为
  • 非常优雅。我错过了 OD.apply 方法。请把它作为答案,我可以将其标记为正确

标签: python csv pandas


【解决方案1】:

您可以通过在“类型”列上调用 apply 创建一个布尔掩码来创建新的 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)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-13
    • 2018-03-15
    • 1970-01-01
    • 2018-01-02
    • 2018-09-29
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    相关资源
    最近更新 更多