繁体   English   中英

Select 数据从两个数据帧转换成两个数据帧 Pandas DataFrame 和 ZA7F5F35426B567411FCZ9231

[英]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是必需的, Agerows_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM