根据存储在向量中的列名对熊猫数据框进行子集

时间:2019-05-02 13:19:20

标签: python-3.x pandas

我正在从一个网站上抓取数据,该网站根据网站上可用的数据使用不同的列名构建一个Pandas数据框。我有一个列名向量,例如:

colnames = ['column1', 'column2', 'column3', 'column5']

这是我希望将抓取的数据存储在其中的postgres数据库的列。

我遇到的问题是,我必须设置抓取以获取所需的所有数据的方式,最后我抓取了一些我没有用并且不在我的postgres数据库中的列。这些列每次都不会具有相同的名称,因为某些页面具有额外的数据,所以我不能简单地排除我不想要的列名称,因为我不知道所有这些将是什么。我的postgres数据库中还会有一些列,这些列的数据不会每次都被抓取。

因此,当我尝试将结果数据帧上载到postgres时,出现错误:

psycopg2.errors.UndefinedColumn: column "column4" of relation "my_db" does not exist

这导致了我的问题:

鉴于某些列可能不存在于数据框中,我如何使用我存储在向量中的列名来对结果熊猫数据框进行子集化?我尝试过my_dt = my_dt[colnames],它返回错误:

KeyError: ['column1', 'column2', 'column3'] not in index

可复制的示例:

df = pd.DataFrame([[1, 2, 3, 4], [5, 6, 7, 8]], columns = 
['column1', 'column2', 'column3', 'column4'])

subset_columns = ['column1', 'column2', 'column3', 'column5']

test = df[subset_columns]

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

我设法找到了一个解决方法,尽管我仍然不知道是什么导致初始的“关键错误”以向量的形式出现,而不仅仅是那些不是我的数据框的列的元素:

df = pd.DataFrame([[1, 2, 3, 4], [5, 6, 7, 8]], columns = 
['column1', 'column2', 'column3', 'column4'])

subset_columns = ['column1', 'column2', 'column3', 'column5']

column_match = set(subset_columns) & set(df.columns)

df = df[column_match]

Out[69]: 
   column2  column1  column3
0        2        1        3
1        6        5        7

答案 1 :(得分:1)

您可以简单地做到:

colnames = ['column1', 'column2', 'column3', 'column5']

df[df.columns & colnames]
相关问题