![](/img/trans.png)
[英]Merging two dataframes in Pandas/Python keeping all columns from dataframe 1
[英]Select data from two dataframes into two dataframes with Pandas DataFrame and Python
我有两个数据框,如下所示
rows_df
Id Location Age
0 0 30
1 1 US 20
2 2
requiredCols_df
RequiredColumn
0 Location
requiredCols_df
指定rows_df
中需要哪一列。 在此示例中, Location
是必需的, Age
在rows_df
中是可选的。
我想根据requiredCols_df
过滤rows_df
。 所以会有两个结果数据帧。 一个包含具有所需列的行,另一个 dataframe 包含没有任何所需列的行。
预期结果
匹配的行
Id Location Age
1 1 US 20
行不匹配
Id Location Age
0 0 30
2 2
请注意:
rows_df
包含多于两列,例如10-30 列。
2 requiredCols_df
包含多于一行。
3 请注意, Location
在第0
行包含一个“”(空格),在第2
行包含一个null
(空)。
rows_df = pd.DataFrame({'Id':['0','1','2'],
'Location': [' ', 'US', None],
'Age':['30','20','']})
下面的列名指定rows_df
中的哪一列不能为空
requiredCols_df = pd.DataFrame([['Location']],
columns= ['RequiredColumn'])
4 更新:生成的 DataFrame 都包含原始未更改的值。
我可以通过循环来做到这一点,但我想看看是否有更好的解决方案。
如果你纠正那些是真正的nans......
req_cols = requiredCols_df.RequiredColumn
rows_df[req_cols] = rows_df[req_cols].replace([r'^\s*$', '', None], np.nan, regex=True)
Id Location Age
0 0 NaN 30
1 1 US 20
2 2 NaN
那么这很简单:
matched = rows_df.dropna(subset=req_cols)
not_matched = rows_df[~rows_df.eq(matched).all(axis=1)]
print(matched)
print(not_matched)
# Output:
Id Location Age
1 1 US 20
Id Location Age
0 0 NaN 30
2 2 NaN
假设您没有大量的列,这似乎是一个循环任务
df_result = rows_df
for column in requiredCols_df["RequiredColumn"]:
df_result = df_result[df_result[column].notnull()]
使用此设置:
import numpy as np
import pandas as pd
rows_df = pd.DataFrame(
{
"Id": [0, 1, 2],
"Location": [np.NaN, "US", np.NaN],
"Age": [30, 20, np.NaN]
}
)
requiredCols_df = pd.DataFrame(
{
"RequiredColumn": ["Location"]
}
)
我们可以很容易地形成 boolean 系列到 select 我们想要的:
required_column_not_null = rows_df[requiredCols_df["RequiredColumn"]].notnull().all(axis=1)
rows_df[required_column_not_null]
Id Location Age
1 1 US 20.0
required_column_null = ~required_column_not_null
rows_df[required_column_null]
Id Location Age
0 0 NaN 30.0
2 2 NaN NaN
li = []
for column_name in requiredCols_df.RequiredColumn:
li.append(rows_df[(rows_df[column_name] != ' ') & (~rows_df[column_name].isnull())])
pd.concat(li)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.