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中任何字符串的名称的列。
答案 0 :(得分:0)
在pandas
中这样做肯定是一种欺骗。但是,您似乎正在将spark DataFrame
转换为pandas DataFrame
。
不是执行(昂贵的)收集操作而然后过滤所需的列,最好只使用spark
在select()
侧进行过滤:
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()
。