繁体   English   中英

根据 dataframe 中的其他行值添加新列

[英]add a new column based on other row values in dataframe

我有这个名为“ test ”的 dataframe 和一个单词列表list_w = ['monthly', 'moon'] 我想添加一个新列“ revised cosine ”,这样:对于list_w中存在的每个单词,带有 ' weak ' 条件和cosine == 'Na' ,其对应条件 ' unrel_weak ' 的修改余弦也将是 ' Na ',类似地,对于 list_w 中存在 ' strong ' 条件且cosine == 'Na'的每个单词,其对应条件 ' unrel_strong ' 的revised cosine也将是 ' Na '

     isi       prime   target     condition  meanRT cosine 
0     50      weekly  monthly        strong   676.2    0.9
1   1050      weekly  monthly        strong   643.5    0.9
2     50       daily  monthly          weak   737.2     Na
3   1050       daily  monthly          weak   670.6     Na
4     50     bathtub  monthly  unrel_strong   692.2    0.1
5   1050     bathtub  monthly  unrel_strong   719.1    0.1
6     50      sponge  monthly    unrel_weak   805.8    0.3
7   1050      sponge  monthly    unrel_weak   685.7    0.3
8     50    crescent     moon        strong   625.0     Na
9   1050    crescent     moon        strong   537.2     Na
10    50      sunset     moon          weak   698.4    0.2
11  1050      sunset     moon          weak   704.3    0.2
12    50    premises     moon  unrel_strong   779.2    0.7
13  1050    premises     moon  unrel_strong   647.6    0.7
14    50     descent     moon    unrel_weak   686.0    0.5
15  1050     descent     moon    unrel_weak   725.4    0.5

我的代码如下:

for w in list_w:
    if test.loc[(test['target']==w) & (test['condition']=='strong'), 'cosine']=='Na':
        test.loc[(test['target']==w) & (test['condition']=='unrel_strong'), 'cosine'] ='Na'

我的代码返回错误:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

我预期的 output 应该像下面的 dataframe 一样(添加了“ revised cosine ”列)

     isi       prime   target     condition  meanRT cosine revised cosine
0     50      weekly  monthly        strong   676.2    0.9  0.9
1   1050      weekly  monthly        strong   643.5    0.9  0.9
2     50       daily  monthly          weak   737.2     Na  Na
3   1050       daily  monthly          weak   670.6     Na  Na
4     50     bathtub  monthly  unrel_strong   692.2    0.1  0.1
5   1050     bathtub  monthly  unrel_strong   719.1    0.1  0.1
6     50      sponge  monthly    unrel_weak   805.8    0.3  Na
7   1050      sponge  monthly    unrel_weak   685.7    0.3  Na
8     50    crescent     moon        strong   625.0     Na  Na
9   1050    crescent     moon        strong   537.2     Na  Na
10    50      sunset     moon          weak   698.4    0.2  0.2
11  1050      sunset     moon          weak   704.3    0.2  0.2
12    50    premises     moon  unrel_strong   779.2    0.7  Na
13  1050    premises     moon  unrel_strong   647.6    0.7  Na
14    50     descent     moon    unrel_weak   686.0    0.5  0.5
15  1050     descent     moon    unrel_weak   725.4    0.5  0.5

有什么想法可以帮助我吗? 我检查了logical_and,但它们似乎只适用于两个条件。 覆盖cosine列也可以,只要 output 就像revised cosine一样。 提前致谢!

此错误消息来自这样一个事实,即您无法使用 Pandas 执行此类 if 语句。

试试这样:

for w in list_w:
    for c in ["weak", "strong"]:
        mask = (
            (test["target"] == w) & (test["condition"] == c) & (test["cosine"] == "Na")
        )
        test.loc[mask, "revised cosine"] = "Na"

解决方案

m = test['cosine'].eq('Na') & \
    test['target'].isin(list_w) & \
    test['condition'].isin(['weak', 'strong'])

i1 = test.set_index(['isi', 'target', 'condition']).index
i2 = test[m].set_index(['isi', 'target', test.loc[m, 'condition'].radd('unrel_')]).index

test['revised_cosine'] = test['cosine'].mask(i1.isin(i2), 'Na')

解释

让我们创建一个 boolean 掩码m ,当cosine列包含Na并且同时target列包含list_w中的单词之一并且condition列是weakstrong时,它保持True

>>> m

0     False
1     False
2      True
3      True
4     False
5     False
6     False
7     False
8      True
9      True
10    False
11    False
12    False
13    False
14    False
15    False
dtype: bool

根据列isitargetcondition创建一个MultiIndex ,我们称之为i1 使用掩码m过滤test dataframe 中的行,为condition列中的过滤行添加前缀unrel_并以类似方式创建另一个 MultiIndex i2

>>> i1
MultiIndex([(  50, 'monthly',       'strong'),
            (1050, 'monthly',       'strong'),
            (  50, 'monthly',         'weak'),
            (1050, 'monthly',         'weak'),
            (  50, 'monthly', 'unrel_strong'),
            (1050, 'monthly', 'unrel_strong'),
            (  50, 'monthly',   'unrel_weak'),
            (1050, 'monthly',   'unrel_weak'),
            (  50,    'moon',       'strong'),
            (1050,    'moon',       'strong'),
            (  50,    'moon',         'weak'),
            (1050,    'moon',         'weak'),
            (  50,    'moon', 'unrel_strong'),
            (1050,    'moon', 'unrel_strong'),
            (  50,    'moon',   'unrel_weak'),
            (1050,    'moon',   'unrel_weak')],
           names=['isi', 'target', 'condition'])

>>> i2
MultiIndex([(  50, 'monthly',   'unrel_weak'),
            (1050, 'monthly',   'unrel_weak'),
            (  50,    'moon', 'unrel_strong'),
            (1050,    'moon', 'unrel_strong')],
           names=['isi', 'target', 'condition'])

使用 boolean Mask屏蔽cosine列中的值,该掩码可以通过测试i1i2中的成员资格来创建

     isi     prime   target     condition  meanRT cosine revised_cosine
0     50    weekly  monthly        strong   676.2    0.9            0.9
1   1050    weekly  monthly        strong   643.5    0.9            0.9
2     50     daily  monthly          weak   737.2     Na             Na
3   1050     daily  monthly          weak   670.6     Na             Na
4     50   bathtub  monthly  unrel_strong   692.2    0.1            0.1
5   1050   bathtub  monthly  unrel_strong   719.1    0.1            0.1
6     50    sponge  monthly    unrel_weak   805.8    0.3             Na
7   1050    sponge  monthly    unrel_weak   685.7    0.3             Na
8     50  crescent     moon        strong   625.0     Na             Na
9   1050  crescent     moon        strong   537.2     Na             Na
10    50    sunset     moon          weak   698.4    0.2            0.2
11  1050    sunset     moon          weak   704.3    0.2            0.2
12    50  premises     moon  unrel_strong   779.2    0.7             Na
13  1050  premises     moon  unrel_strong   647.6    0.7             Na
14    50   descent     moon    unrel_weak   686.0    0.5            0.5
15  1050   descent     moon    unrel_weak   725.4    0.5            0.5

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM