连接两个具有不同行数的 CSV 返回警告

Concat two CSVs with different number of rows returning warning

我需要连接两个行数不同的 CSV。当我这样做时,我会收到一条警告,当我通过目视检查知道有匹配的行时,print(df1.head()) return 中的结果是一个空数据框。

警告是否会影响 head() 中反映的结果?还是我需要解决其他问题?

# columns to filter on
columns_to_match = ['column1', 'column2', 'column3', 'column4', 'column5']

# find matching rows based off columns in filter 
filter = df1[columns_to_match].eq(df2[columns_to_match]).all(axis=1)

# concat filtered results
df1 = pd.concat([df1[columns_to_match], df2[columns_to_match]])

# print matching results 
print(df1.head())

我收到以下错误:

UserWarning: Boolean Series key will be reindexed to match DataFrame index.
df1 = pd.concat([df1[filter], df2[filter]])

谢谢。

首先,filter 有多种用途,这很令人困惑 error-prone。我认为出现警告是因为 filter = df1[filter].eq(df2[filter]).all(axis=1) 是与 df1 对齐的系列。但是,您随后尝试使用相同的掩码系列对 df2 进行子集化。

解决它的一种方法是使用例如filter2 = df2[cols].eq(df1[cols]).all(axis=1) 然后做 df1 = pd.concat([df1[filter], df2[filter2]])

(注意我在这里定义的是cols = ['column1', 'column2', 'column3', 'column4', 'column5']

编辑 - 这应该有效:

# find matching rows based off columns in filter 
filter1 = df1[columns_to_match].eq(df2[columns_to_match]).all(axis=1)
filter2 = df2[columns_to_match].eq(df1[columns_to_match]).all(axis=1)

# concat filtered results
df1 = pd.concat([df1[filter1], df2[filter2]])

感谢 @ags29 and @not_speshal。你的两个建议让我找到了这个解决方案。

# columns to filter on
columns_to_match = ['column1', 'column2', 'column3', 'column4', 'column5']

# merge filtered results)
df1 = pd.merge(df1, df2, on=columns_to_match)

print(df1.head())