Python Pandas:如何从包含列表中的值的数据框中删除所有列?

时间:2018-01-08 19:32:08

标签: python pandas pyspark spark-dataframe

include_cols_path = sys.argv[5]
with open(include_cols_path) as f:
include_cols = f.read().splitlines()

include_cols是一个字符串列表

df1 = sqlContext.read.csv(input_path + '/' + lot_number +'.csv', header=True).toPandas()

df1是大文件的数据框。我想只保留包含include_cols中任何字符串的名称的列。

3 个答案:

答案 0 :(得分:0)

pandas中这样做肯定是一种欺骗。但是,您似乎正在将spark DataFrame转换为pandas DataFrame

不是执行(昂贵的)收集操作而然后过滤所需的列,最好只使用sparkselect()侧进行过滤:

df1 = sqlContext.read.csv(input_path + '/' + lot_number +'.csv', header=True)
pandas_df = df1.select(include_cols).toPandas()

您还应该考虑转换为pandas DataFrame是否真的是您想要做的事情。您在pandas中可以执行的任何操作也可以在spark中完成。

修改

我最初误解了你的问题。根据您的意见,我认为这正是您所寻找的:

selected_columns = [c for c in df1.columns if any([x in c for x in include_cols])]
pandas_df = df1.select(selected_columns).toPandas()

<强>解释: 遍历df1中的列,并仅保留列名称中包含include_cols中至少一个字符串的列。如果至少有一个条件为any(),则True函数会返回True

答案 1 :(得分:0)

final_cols = [col for col in df.columns.values if col in include_cols]
df = df[final_cols]

答案 2 :(得分:0)

df1.loc[:, df1.columns.str.contains('|'.join(include_cols))]

例如:

df1 = pd.DataFrame(data=np.random.random((5, 5)), columns=list('ABCDE'))
include_cols = ['A', 'C', 'Z']
df1.loc[:, df1.columns.str.contains('|'.join(include_cols))]
>>>           A         C
    0  0.247271  0.761153
    1  0.390240  0.050055
    2  0.333401  0.823384
    3  0.821196  0.929520
    4  0.210226  0.406168

'|'.join(include_cols)部分将创建一个or条件,其中包含输入列表的所有元素。在上面的示例A|C|Z中。如果列名中的某个元素包含,则使用列名称上的True方法,此条件为.contains()