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可能不是一个好主意