【问题标题】:Map a Pandas Series with duplicate keys to a DataFrame将具有重复键的 Pandas 系列映射到 DataFrame
【发布时间】:2022-01-15 15:33:08
【问题描述】:

环境:Python 3.9.6、Pandas 1.3.5


我有一个 DataFrame 和一个如下所示的系列

df = pd.DataFrame({"C1" : ["A", "B", "C", "D"]})
sr = pd.Series(data  = [1, 2, 3, 4, 5],
               index = ["A", "A", "B", "C", "D"])
"""
[DataFrame]
   C1
0  A
1  B
2  C
3  D

[Series]
A    1
A    2
B    3
C    4
D    5
"""

我试过了,

df["C2"] = df["C1"].map(sr)

但是发生了 InvalidIndexError,因为该系列有重复的键(“A”)。 pandas.errors.InvalidIndexError:重新索引仅对具有唯一值的索引对象有效

有什么方法可以像下面这样制作DF吗?

   C1 C2
0  A  1
1  A  2
2  B  3
3  C  4
4  D  5

or

   C1 C2
0  A  1    
1  B  3
2  C  4
3  D  5
4  A  2

行索引无关紧要。

【问题讨论】:

    标签: python python-3.x pandas


    【解决方案1】:

    这个问题经过大量编辑,现在具有非常不同的含义。

    你想要一个简单的merge:

    df.merge(sr.rename('C2'),
             left_on='C1', right_index=True)
    

    输出:

      C1  C2
    0  A   1
    0  A   2
    1  B   3
    2  C   4
    3  D   5
    
    旧答案

    首先,我不会重现您的问题(在 pandas 1.3.5 上使用 3M 行测试)。

    那你为什么用切片而不是map?这将具有系统地输出正确行数的优势(如果键不存在,则为 NaN):

    例子:

    sr = pd.Series({10:"A", 13:"B", 16:"C", 18:"D"})
    df = pd.DataFrame({"C1":np.random.randint(10, 20, size=3000000)})
    df['C2'] = df['C1'].map(sr)
    print(df.head())
    

    输出:

       C1   C2
    0  10    A
    1  18    D
    2  10    A
    3  13    B
    4  15  NaN
    

    【讨论】:

    • 我不知道“地图”。但是“地图”让我知道该系列中有重复的键。因此,我对问题进行了很多编辑。无论如何,你的回答指导了我。谢谢。
    • @Sangeun 好的,那么你想要一个merge
    • 哇.. 太完美了。我接受了你的回答。
    猜你喜欢
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 2018-09-30
    • 2017-06-25
    • 2010-11-06
    • 2023-03-15
    相关资源
    最近更新 更多