根据条件将值从一个pandas数据帧替换为另一个pandas数据帧

时间:2016-05-21 13:30:11

标签: python pandas dataframe

我有两个包含多列的数据框。

df_1 = pd.DataFrame({'A': ['x', '-', 'z'], 'B': [1, 6, 9], 'C': [2, 1, '-']})
> df_1

   A  B  C
0  x  1  2
1  -  6  1
2  z  9  -

df_2 = pd.DataFrame({'A': ['w', 'y', 'y'], 'B': [5, 6, 9], 'C': [2, 1, 8]})
> df_2

   A  B  C
0  w  5  2
1  y  6  1
2  y  9  8

如何根据条件(布尔掩码)将一个数据帧中的值替换为另一个数据帧中的值? 在这里,缺少值标记为'-',我想使用df_2中的值来获取结果:

> df
   A  B  C
0  x  1  2
1  y  6  1
2  z  9  8   

1 个答案:

答案 0 :(得分:4)

IIUC您可以创建boolean mask,将值string转换为-,然后与-进行比较。上一个填充值为DataFrame来自astypemaskmask ~ mask = df_1.astype(str) == '-' print (mask) A B C 0 False False False 1 True False False 2 False False True print (df_1.mask(mask, df_2)) A B C 0 x 1 2 1 y 6 1 2 z 9 8 print (df_1.where(~mask, df_2)) A B C 0 x 1 2 1 y 6 1 2 z 9 8

masks = [('A', r'[a-zA-Z]'), ('B', r'\d'), ('C', r'\d')]; 
print pd.concat([~(df_1[col].astype(str).str.contains(regex)) for col, regex in masks], axis=1)

通过评论编辑:

一种可能的解决方案是where,谢谢:

mask

另一个解决方案创建NaN - 可能dict NaNimport pandas as pd import numpy as np df_1 = pd.DataFrame({'A': ['-x', '-', np.nan],'B': [1, 6, 'Unknown'],'C': [2, 1, 'Missing']}) print (df_1) df_2 = pd.DataFrame({'A': ['w', 'y', 'y'], 'B': [5, 6, 9], 'C': [2, 1, 8]}) print (df_2) mask_li = ['-','Unknown','Missing'] d = {x:np.nan for x in mask_li} mask = df_1.fillna(1).replace(d).isnull() print (mask) A B C 0 False False False 1 True False False 2 False True True print (df_1.mask(mask, df_2)) A B C 0 -x 1 2 1 y 6 1 2 NaN 9 8 个值,然后su79eu7k错过mask_limask_li = ['-','Unknown','Missing'] mask= df_1.copy() for col in df_1.columns: mask[col] = mask[col].astype(str).str.contains('|'.join(mask_li)) print (mask) A B C 0 False False False 1 True False False 2 False True True print (df_1.mask(mask, df_2)) A B C 0 x 1 2 1 y 6 1 2 z 9 8 的值并且最后找到{ {3}}值。

mask_li

您可以使用fillna,但其他数据不能包含列表-中的值:

import pandas as pd
import numpy as np

df_1 = pd.DataFrame({'A': ['-x', '-', '-z'], 'B': [1, 6, 'Unknown'], 'C': [2, 1, 'Missing']})
print (df_1)

df_2 = pd.DataFrame({'A': ['w', 'y', 'y'], 'B': [5, 6, 9], 'C': [2, 1, 8]})
print (df_2)

mask_li = ['-','Unknown','Missing']    

mask= df_1.copy()
for col in df_1.columns:
    mask[col] = mask[col].astype(str).str.contains('|'.join(mask_li))

print (mask)
      A      B      C
0  True  False  False
1  True  False  False
2  True   True   True

print (df_1.mask(mask, df_2))    
   A  B  C
0  w  1  2
1  y  6  1
2  y  9  8

但如果其他数据包含来自import pandas as pd import numpy as np df_1 = pd.DataFrame({'A': ['-x', '-', '-z'], 'B': [1, 6, 'Unknown'], 'C': [2, 1, 'Missing']}) print (df_1) df_2 = pd.DataFrame({'A': ['w', 'y', 'y'], 'B': [5, 6, 9], 'C': [2, 1, 8]}) print (df_2) mask_li = ['Unknown','Missing'] mask= df_1.copy() for col in df_1.columns: column = mask[col].astype(str) mask[col] = (column.str.contains('|'.join(mask_li))) | (column == '-') print (mask) A B C 0 False False False 1 True False False 2 False True True print (df_1.mask(mask, df_2)) A B C 0 -x 1 2 1 y 6 1 2 -z 9 8 的值,则可能会出现问题。 #ifndef PERSON_H #define PERSON_H #include <Birthdate.h> class Person { public: Person(int age, Birthdate BirthdateObj); virtual ~Person(); void showPersonInformation(); private: int age; Birthdate BirthdateObj; }; #endif // PERSON_H

E.g:

#include "Person.h"
#include <iostream>

Person::Person(int age, Birthdate BirthdateObj) : age(age), BirthdateObj(BirthdateObj)
{
    //ctor
}

Person::~Person()
{
    //dtor
}

void Person::showPersonInformation()
{
    std::cout << "Current age: " << age << std::endl;
    std::cout << "Birthdate: " << BirthdateObj.showBirthDate();
}

一种可能的解决方案:

#ifndef BIRTHDATE_H
#define BIRTHDATE_H


class Birthdate
{
    public:
        Birthdate(int day, int month, int year);
        virtual ~Birthdate();

        void showBirthDate();

    private:
        int day, month, year;
};

#endif // BIRTHDATE_H