Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python-apply(lambda x:…)函数,当值是一个系列或数据帧时应用于字典值_Python_Pandas_Dictionary_Lambda_Apply - Fatal编程技术网

python-apply(lambda x:…)函数,当值是一个系列或数据帧时应用于字典值

python-apply(lambda x:…)函数,当值是一个系列或数据帧时应用于字典值,python,pandas,dictionary,lambda,apply,Python,Pandas,Dictionary,Lambda,Apply,我试图对作为数据帧的字典值使用apply(lambda x:…)函数,但得到的是ValueError:序列的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all()。我知道这在dataframe列上有效。但我想知道是否有一种方法可以在字典值上使用它。我做错了什么 import pandas as pd df = pd.DataFrame({'Gender':['M','M','M','F','F','O1','O2'],

我试图对作为数据帧的字典值使用apply(lambda x:…)函数,但得到的是ValueError:序列的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all()。我知道这在dataframe列上有效。但我想知道是否有一种方法可以在字典值上使用它。我做错了什么

import pandas as pd
df = pd.DataFrame({'Gender':['M','M','M','F','F','O1','O2'],
                   'A1':[2,4,8,7,6,4,5],'A2':[2,4,8,7,6,4,5],
                   'B1':[5,8,9,7,5,6,3]})
df
#>   Gender  A1  A2  B1
0      M   2   2   5
1      M   4   4   8
2      M   8   8   9
3      F   7   7   7
4      F   6   6   5
5     O1   4   4   6
6     O2   5   5   3
    
dct = {}
for cat in ['Gender','A','B']:
    dct[cat] = df[[c for c in df.columns if c.startswith(cat)]]
dct
#> {'Gender':   Gender
 0      M
 1      M
 2      M
 3      F
 4      F
 5     O1
 6     O2,
 'A':    A1  A2
 0   2   2
 1   4   4
 2   8   8
 3   7   7
 4   6   6
 5   4   4
 6   5   5,
 'B':    B1
 0   5
 1   8
 2   9
 3   7
 4   5
 5   6
 6   3}

## apply
g = dct['Gender'].apply(lambda x: 'Other' if x not in ['M','W'] else x]

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

所需输出

  Gender
0      M
1      M
2      M
3      F
4      F
5     Other
6     Other
问题:

  • 如何将apply(lambda x:…)函数传递给字典键的值(它是一个系列或数据帧列)? 能做到吗
  • 你可以在这里直接使用。熊猫有很多可以利用的杠杆

    m = df['Gender'].str.fullmatch(r'[^MF]')
    df.loc[m, 'Gender'] = 'Other'
    
    print(df)
    #   Gender  A1  A2  B1
    # 0      M   2   2   5
    # 1      M   4   4   8
    # 2      M   8   8   9
    # 3      F   7   7   7
    # 4      F   6   6   5
    # 5  Other   4   4   6
    # 6  Other   5   5   3
    
    • 关于正则表达式模式的详细信息
      • 你可以试试

        dct['Gender']['Gender'].apply(lambda x: 'Other' if x not in ['M','W'] else x)
        # Output:
        0        M
        1        M
        2        M
        3    Other
        4    Other
        5    Other
        6    Other
        Name: Gender, dtype: object
        
        dct['Gender']
        作为一个整体访问值(这里是一个数据帧)

        dct['Gender']['Gender']
        访问数据帧中作为值的列。然后,就可以对其使用apply()函数

        type(dct['Gender']['Gender'])
        #> pandas.core.series.Series
        
        文档:
        熊猫。系列。应用

        调用系列值的函数。

        我无法使用Ch3steR答案中的一行解决方案作为
        fullmatch
        (可能不同版本?)


        df.loc[~df.Gender.isin(['M','F']),'Gender']='Others'

        请您解释一下
        r'[^MF]'
        中的所有组件都做了什么或表示了什么?在str.match函数中用“[]”括起时会发生什么情况?你做什么?为什么不需要在MF之间插入逗号?r'xxx'有什么帮助?@rahul ahuja这是正则表达式模式。详情
        type(dct['Gender']['Gender'])
        #> pandas.core.series.Series