使用预定义的条件从数据框列表创建数据框

时间:2019-06-05 18:55:06

标签: python pandas dataframe

请考虑以下列表my_list,其中存储了3个数据框:

                DF1
fur_color    frequency    column_name
Black          9843         fur_color
Brown          8733         fur_color
White          3419         fur_color
BLACK          1277         fur_color
Tan            988          fur_color

                DF2
size         frequency    column_name
Small          8391          size
Medium         4730          size
Mdm            1322          size
L              4531          size
Large          5286          size

                      DF3
adoption_status    frequency    column_name
    Yes             11239      adoption_status
    Y               1532       adoption_status
    No              3588       adoption_status
 Scheduled          4127       adoption_status
   Sched.           3774       adoption_status

我想创建一个由列表中每个DataFrame的所有错误值组成的单个DataFrame。

在fur_color列中,诸如Tan(应为棕色)或BLACK(应为黑色),Mdm(应为中)和L(应为大小列中的“大”,而采用状态字段中的Y(应为是)和Sched.(应为已安排)都是错误值。

理想情况下,我想创建一个如下所示的DataFrame:

                       erroneous_values
error_value    frequency    column_name   expected_value
BLACK          1277          fur_color        Black
Tan            988           fur_color        Brown
Mdm            1322            size           Medium
L              4531            size           Large
Y              1532        adoption_status    Yes
Sched.         3774        adoption_status    Scheduled

出于编程目的,请假设频率列中的值每天都会更新并且可以更改。

我有一些预定义的标准,可以使查找错误变得容易。

  • fur_color值应在列表中[[Black],“ Brown”,“ White”]
  • 尺寸值应在[“ Small”,“ Medium”,“ Large”]列表中
  • adoption_status值应在列表中[预定”,“是”,“否”

我一直在尝试通过在列上使用in / not in来检查它们是否具有不在可接受的值列表中的值,但是,我找不到一种将其实现为DataFrame的好方法(通常返回列表)。有没有可扩展的(假设添加了更多的DataFrames)和优雅的解决方案来解决这个问题?

1 个答案:

答案 0 :(得分:1)

您可以使用这样的过滤器

df1[~df1['fur_color'].isin(['Black','White','Brown'])

~说,过滤器df1['fur_color'].isin(['Black','White','Brown'])的结果应取反,并且仅选择“其他”行

例如

df1 = pd.read_clipboard()
df1
  fur_color  frequency column_name
0     Black       9843   fur_color
1     Brown       8733   fur_color
2     White       3419   fur_color
3     BLACK       1277   fur_color
4       Tan        988   fur_color

df1_errors = df1[~df1['fur_color'].isin(['Black','White','Brown'])
df1_errors

  fur_color  frequency column_name
3     BLACK       1277   fur_color
4       Tan        988   fur_color