我有两个包含多列的数据框。
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
答案 0 :(得分:4)
IIUC您可以创建boolean mask
,将值string
转换为-
,然后与-
进行比较。上一个填充值为DataFrame
来自astype
或mask
的mask
~
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
NaN
个import 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_li
到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 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