Python 如何基于空值将一行列值分配给另一行列
我有一个数据帧Python 如何基于空值将一行列值分配给另一行列,python,python-3.x,pandas,Python,Python 3.x,Pandas,我有一个数据帧 Col1 Col2 Col3 Col4 Col5 A123 13500 2/03/19 0 NaN B123 2000 3/04/19 0 Distinct C123 500 8/09/19 1 Match D123 100 11/01/19 1 NaN E123 1350 2/03/19
Col1 Col2 Col3 Col4 Col5
A123 13500 2/03/19 0 NaN
B123 2000 3/04/19 0 Distinct
C123 500 8/09/19 1 Match
D123 100 11/01/19 1 NaN
E123 1350 2/03/19 2 NaN
F123 2000 3/04/19 2 Match
G123 500 8/09/19 3 Distinct
H123 100 11/01/19 3 NaN
我想根据Col4
循环遍历这些行,并相应地更新Col5(NaN)
行
也就是说,当我选择Col4
为0的行时,我希望基于其他行-列值更新Col5
Output:
Col1 Col2 Col3 Col4 Col5
A123 13500 2/03/19 0 **Distinct**
B123 2000 3/04/19 0 Distinct
C123 500 8/09/19 1 Match
D123 100 11/01/19 1 **Match**
E123 1350 2/03/19 2 **Match**
F123 2000 3/04/19 2 Match
G123 500 8/09/19 3 Distinct
H123 100 11/01/19 3 **Distinct**
我想你要找的是函数np.where。我假设您希望在
Col4=0
时将值'Distinct'分配给Col5
,在Col4=1
时将值'Match'。那么您的代码将是:
df['Col5'] = np.where(df.Col4==0, 'Distinct', 'Match')
当然,您可以根据逻辑对代码进行调整,以适应任何需要的条件语句,似乎您希望将
Col4
中的0,3值映射到Col5
中的“Distinct”,将1,2值映射到“Match”。您只想更新Col5
中的NaN
值
尝试:
df=pd.DataFrame({'Col4':[0,1,2,3,0,1,2,3],
‘Col5’:[“不同的”、“匹配的”、“匹配的”、“不同的”、np.nan、np.nan、np.nan、np.nan])
映射器={
0:“**不同**”,
1:“**匹配**”,
2:“**匹配**”,
3:“**不同**”
}
df.loc[df.Col5.isna(),'Col5']=df[df.Col5.isna()]['Col4'].map(映射器)
您现在可以获得:
Col4 Col5
0 0 Distinct
1 1 Match
2 2 Match
3 3 Distinct
4 0 **Distinct**
5 1 **Match**
6 2 **Match**
7 3 **Distinct**
如果您改变了对逻辑或替换值的想法,那么以后可以很容易地更改映射。好的,我在这里假设两件事: 1) 第4列中每个数字只有两个条目 2) Col4中具有相同编号的两个条目彼此相邻放置(实际上这并不重要,如果不是这样,您可以始终按Col4对数据帧进行排序,您将得到这种情况) 代码如下:
df = df.replace(np.nan,"None")
txt = "None"
for i in range(df.Col4.size):
if (df.loc[i,'Col5']=="None"):
df.loc[i,'Col5'] = txt
txt = "None"
else:
txt = df.loc[i,'Col5']
txt = "None"
for i in reversed(range(df.Col4.size)):
if (df.loc[i,'Col5']=="None"):
df.loc[i,'Col5'] = txt
txt = "None"
else:
txt = df.loc[i,'Col5']
我在这里做了三个步骤
1) 将所有nan替换为字符串,以便在使用if时不会出现任何数据类型比较问题
2) 循环以升序排列。如果Col5中的值为“None”,则将其替换为“txt”中的值。否则,“txt”变量将与Col5中的值一起存储
3) 相同的循环顺序相反
我希望这能解决您的问题。
基于其他行-列值,哪个其他…?哪个列值。我根据Col4选择两行,在示例中,我将选择A123和B123行。我想用另一行B123 Col5 valueAgree with@Minato更新A123行中的空列(Col5)。但首先,你不想循环。任何这样的值替换都应该通过向量操作来完成。您需要指定“对于Col4
中的此值,我希望在Col5
中看到此值以替换NaN
值。”如果您无法澄清预期的输入/输出,我们将无能为力。Col4仅用于选择两行,可以是0、1、2…等等。Col5的值可以是Distinct/Match。如果是NaN,我想将Col5值复制到另一行(具有相同的Col4值)。我希望我清楚地知道explaining@user12277274我认为您需要提供一个更清晰的输入示例(在Col4
和Col5
中的值)和您想要的输出。它需要相当全面,包括您希望涵盖的所有案例。@user12277274是的,请让示例更清楚一些。也许你可以在你的输入中添加更多的行,并显示出你预期的输出是修改的,例如我认为他的实际列表很长;所以使用mapper可能不是一个好主意