【问题标题】:Cannot assign value for column in pandas DataFrame using another column's value as Series' key无法使用另一列的值作为系列键为 pandas DataFrame 中的列分配值
【发布时间】:2014-02-19 03:59:21
【问题描述】:

考虑一个使用 Dataframe df 和 Series s 的简单示例

import pandas as pd

matching_vals = range(20,30)

df = pd.DataFrame(columns=['a'], index=range(0,10))
df['a'] = matching_vals
s  = pd.Series(list("ABCDEFGHIJ"), index=matching_vals)

df['b'] = s[df['a']]

此时我希望df['b'] 包含字母AJ,但实际上都是NaN。但是,如果我用

替换最后一行
n = df['a'][2]
df['c'] = s[n]

然后df['c'] 充满了Cs,正如我所料,所以我很确定这不是什么奇怪的类型错误。

我是 pandas 的新手,这让我发疯了。

【问题讨论】:

    标签: python pandas dataframe series


    【解决方案1】:

    s[df['a']] 的索引与df 的索引不同:

    In [104]: s[df['a']]
    Out[104]: 
    a
    20    A
    21    B
    22    C
    23    D
    24    E
    25    F
    26    G
    27    H
    28    I
    29    J
    

    当您将 Series 分配给 DataFrame 的列时,Pandas 会尝试根据索引分配值。由于s[df['a']] 没有与df 的索引关联的任何值,因此分配了NaN 值。分配不会向df 添加新行。

    如果你不希望索引进入作业,你可以使用

    df['b'] = s[df['a']].values
    

    有关索引匹配的演示,请注意如何

    import pandas as pd
    
    df = pd.DataFrame(columns=['a'], index=range(0,10))
    df['a'] = range(0,10)[::-1]
    s  = pd.Series(list("ABCDEFGHIJ"), index=range(0,10)[::-1])
    df['b'] = s[df['a']]
    

    产量

    In [123]: s[df['a']]
    Out[123]: 
    a
    9    A
    8    B
    7    C
    6    D
    5    E
    4    F
    3    G
    2    H
    1    I
    0    J
    dtype: object
    
    In [124]: df
    Out[124]: 
       a  b
    0  9  J
    1  8  I
    2  7  H
    3  6  G
    4  5  F
    5  4  E
    6  3  D
    7  2  C
    8  1  B
    9  0  A
    
    [10 rows x 2 columns]
    

    df['b'] 的值被“翻转”以使索引匹配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-05
      • 2019-07-16
      • 2022-01-22
      相关资源
      最近更新 更多