Pandas:使用if语句根据数据透视表值为数据帧列分配值

时间:2015-05-28 07:53:52

标签: python pandas

我使用Titanic Kaggle数据作为探索熊猫的手段。我试图找出如何在.ix [](或其他方面)中使用if语句。我有一个数据透视表我用来在我的主数据帧中获取查找值。这是数据透视表的一大块(名为'数据'):

src

现在我想通过主数据框中的每一行来分配它的查找值。查找硬编码的值没问题,如:

                     Survived       Count      % Female Survived % Male Survived  \
Sex               female male female male                                     
Embarked Pclass                                                               
C        1            42   17     43   42             97.67           40.48   
         2             7    2      7   10            100.00           20.00   
         3            15   10     23   43             65.22           23.26

但是,当尝试插入动态部分以包含if语句时,事情就不那么好了:

df['Chance of Survival'] = data.ix['C']['% Female Survived'].get(1)
97.67

因此,我的主数据框中的所需输出如下所示:

df['Chance of Survival'] = data.ix[df.Embarked][('% Female Survived' if df.Sex == 'female') | ('% Male Survived' if df.Sex=='male')].get(df.Pclass)

提前致谢! :)

2 个答案:

答案 0 :(得分:1)

得到它,但万一其他人有类似的问题。或者更好的是,如果有人有更好的方法。 :)

Traceback (most recent call last):
  File "E:/PythonProjects/skypy/skypy/codebase/utils/crypto.py", line 32, in <module>
    print(RSAPubKey.encrypt("Hello.", 32))
  File "E:\Programs\Python3.4\lib\site-packages\Crypto\PublicKey\RSA.py", line 150, in encrypt
    return pubkey.pubkey.encrypt(self, plaintext, K)
  File "E:\Programs\Python3.4\lib\site-packages\Crypto\PublicKey\pubkey.py", line 75, in encrypt
    ciphertext=self._encrypt(plaintext, K)
  File "E:\Programs\Python3.4\lib\site-packages\Crypto\PublicKey\RSA.py", line 224, in _encrypt
    return (self.key._encrypt(c),)
  File "E:\Programs\Python3.4\lib\site-packages\Crypto\PublicKey\_slowmath.py", line 65, in _encrypt
    return pow(m, self.e, self.n)
TypeError: unsupported operand type(s) for pow(): 'str', 'int', 'int'

所以任何想要根据另一个数据帧的值在一个数据帧的列中赋值的人。我使用.ix []向下钻取到值,然后使用.apply()在每一行(axis = 1)上应用一个函数,就像查询数据帧一样找到行的值。 ( 'line.element'/线[ '元件'])

答案 1 :(得分:0)

据我了解您的问题,您希望为现有数据框指定值,而您当前正在使用DataFrame.ix

您可能需要的方法是DataFrame.loc,其工作方式如下:

df = pd.DataFrame({'foo':[1,2,3,4], 'bar':[1,2,3,4]})
df

   bar  foo

0   1   1
1   2   2
2   3   3
3   4   4

df.loc[1]['foo'] = 4
df

   bar  foo
0   1   1
1   2   4
2   3   3
3   4   4

如果要分配给新列,只需先创建它们,只需

即可
df['newcolumn'] = np.nan

然后你可以用上面的代码分配它。