基于python中的熊猫索引在新列中添加值

新手上路,请多包涵

我刚开始接触熊猫,我正在尝试向现有数据框添加一个新列。

我有两个数据框,其中一个数据框的索引链接到另一个数据框中的列。如果这些值相等,我需要将源数据框中另一列的值放入目标列的新列中。

下面的代码部分说明了我的意思。评论部分是我需要的输出。

我想我需要 .loc[] 功能。

另一个次要问题:拥有非唯一索引是不是不好的做法?

 import pandas as pd

d = {'key':['a',  'b', 'c'],
     'bar':[1, 2, 3]}

d2 = {'key':['a', 'a', 'b'],
      'other_data':['10', '20', '30']}

df = pd.DataFrame(d)
df2 = pd.DataFrame(data = d2)
df2 = df2.set_index('key')

print df2

##    other_data  new_col
##key
##a            10   1
##a            20   1
##b            30   2

原文由 ArnJac 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 402
2 个回答

另一个次要问题:拥有非唯一索引是不是不好的做法?

这不是很好的做法,但取决于您的需要,在某些情况下可能没问题。

问题 1:加入操作

一个好的起点是考虑是 什么让 Index 与标准 DataFrame 列不同。这就产生了一个问题:如果您的索引有重复值,是否真的需要将其指定为索引,或者它是否只是 RangeIndex ed DataFrame 中的另一列?如果您曾经使用过 SQL 或任何其他 DMBS,并且想使用 .join.merge 函数模拟 pandas 中的连接操作,如果您有重复的索引值。合并将为您提供基本上是笛卡尔积的东西——可能不是您要找的东西。

例如:

 df = pd.DataFrame(np.random.randn(10,2),
                  index=2*list('abcde'))
df2 = df.rename(columns={0: 'a', 1 : 'b'})
print(df.merge(df2, left_index=True, right_index=True).head(7))
         0        1        a        b
a  0.73737  1.49073  0.73737  1.49073
a  0.73737  1.49073 -0.25562 -2.79859
a -0.25562 -2.79859  0.73737  1.49073
a -0.25562 -2.79859 -0.25562 -2.79859
b -0.93583  1.17583 -0.93583  1.17583
b -0.93583  1.17583 -1.77153 -0.69988
b -1.77153 -0.69988 -0.93583  1.17583

问题 2:性能

本文 所述,唯一值索引使某些操作变得高效。

当索引唯一时,pandas 使用哈希表将键映射到值 O(1)。当索引非唯一且已排序时,pandas 使用二进制搜索 O(logN),当索引是随机排序时,pandas 需要检查索引中的所有键 O(N)。

关于 .loc

使用 .loc 将返回标签的所有实例。根据您的目标,这可能是一种祝福或诅咒。例如,

 df = pd.DataFrame(np.random.randn(10,2),
                  index=2*list('abcde'))
print(df.loc['a'])
         0        1
a  0.73737  1.49073
a -0.25562 -2.79859

原文由 Brad Solomon 发布,翻译遵循 CC BY-SA 3.0 许可协议

使用重命名 index Series

 df2['new'] = df2.rename(index=df.set_index('key')['bar']).index
print (df2)

    other_data  new
key
a           10    1
a           20    1
b           30    2

或者 map

 df2['new'] = df2.index.to_series().map(df.set_index('key')['bar'])
print (df2)

    other_data  new
key
a           10    1
a           20    1
b           30    2

如果想要更好的性能,最好的办法是避免索引重复。还有一些功能,如 reindex 在重复索引中失败。

原文由 jezrael 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题