繁体   English   中英

pandas concat DataFrame对不同的索引

pandas concat DataFrame on different Index

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

一般问题

我有一个任意名单pandas.DataFrame的(让我们用2保持示例清楚),我想concat他们的Index是:

  1. 既不是现有DataFramesinner也不是outer连接
  2. 是一个不同的单独Index ,但只有所有DataFrame的日期

例如,采用以下2个DataFrame (注意Index形状的不同):

In [01]: d1 = pandas.DataFrame( numpy.random.randn(15, 4), 
                                columns = ['a', 'b', 'c', 'd'], 
                                index = pandas.DatetimeIndex(start = '01/01/2001', 
                                                             freq = 'b', 
                                                             periods = 15)
          )

In [02]: d2 = pandas.DataFrame( numpy.random.randn(17, 4), 
                                columns = ['e', 'f', 'g', 'h'], 
                                index = pandas.DatetimeIndex(start = '01/05/2001', 
                                                             freq = 'b', 
                                                             periods = 17)
          )

我想在这里构造的交叉Index上加入这两个DataFrame ,例如my_index

In [03]: ind = range(0, 10, 2)
In [04]: my_index = d2.index[ind].copy()

因此,以下结果应该具有相同的结果:

In [05]: d1.loc[my_index, :].join(d2.loc[my_index, :] )
Out[65]: 
               a         b         c         d         e         f  \
2001-01-05  1.702556 -0.885554  0.766257 -0.731700 -1.071232  1.806680   
2001-01-09 -0.968689 -0.700311  1.024988 -0.705764  0.804285 -0.337177   
2001-01-11  1.249893 -0.613356  1.975736 -0.093838  0.428004  0.634204   
2001-01-15  0.430000  0.502100  0.194092  0.588685 -0.507332  1.404635   
2001-01-17  1.005721  0.604771 -2.296667  0.157201  1.583537  1.359332   

               g         h  
2001-01-05 -1.183528  1.260880  
2001-01-09  0.352487  0.700853  
2001-01-11  1.060694  0.040667  
2001-01-15 -0.044510  0.565152  
2001-01-17 -0.731624 -0.331027  

个人考虑因素

因为这是一个更大的应用程序,我将有任意数量的DataFrame ,我想:

  1. 使用现有的pandas功能而不是构建我自己的hack,即reduce( map ( ) )等。
  2. 返回DataFrame交集的视图,而不是创建DataFrame的副本
2 个回复

我认为没有开箱即用的Pandas功能。 但是,建立自己的并不难:

def select_join(dfs, index):
    result = dfs[0].reindex(index)
    for df in dfs[1:]:
        result = result.join(df, how='inner')
    return result

例如,

import numpy as np
import pandas as pd
import string
import itertools as IT

columns = iter(string.letters)
dfs = []
for i in range(3):
    d1 = pd.DataFrame( np.random.randn(15, 4), 
                           columns = list(IT.islice(columns, 4)), 
                           index = pd.DatetimeIndex(start = '01/01/2001', 
                                                    freq = 'b', 
                                                    periods = 15))
    dfs.append(d1)

ind = range(0, 10, 2)
my_index = d1.index[ind].copy()
print(select_join(dfs, my_index))

产量

                   a         b         c         d         e         f  \
2001-01-01  0.228430 -1.154375 -0.612703 -2.760826 -0.877355 -0.071581   
2001-01-03  1.452750  1.341027  0.051486  1.231563  0.428353  1.320172   
2001-01-05 -0.966979 -1.997200 -0.376060 -0.692346 -1.689897  0.549653   
2001-01-09 -0.117443 -0.888103  2.092829 -0.467220 -1.083004 -1.443015   
2001-01-11 -0.168980 -0.152663  0.365618  0.444175 -1.472091 -0.578182   

                   g         h         i         j         k         l  
2001-01-01 -0.098758  0.920457 -1.072377 -0.627720  0.223060  0.903130  
2001-01-03  1.962124  1.134501 -0.209813 -2.309090  0.358121  0.655156  
2001-01-05  1.088195 -1.705393 -0.161167 -0.339617  0.945495  0.220701  
2001-01-09  0.970829  1.931192  0.943150 -1.895580  0.815188 -1.485206  
2001-01-11  0.747193 -1.221069 -0.164531 -0.395197 -0.754051  0.922090  

关于第二个考虑因素:如果index是任意的,则无法返回视图。 DataFrame将数据(类似dtype)存储在NumPy数组中。 从NumPy数组中选择任意行时,将分配新数组的空间,并将行从原始数组复制到新数组中。 仅当选择可以表示为基本切片时才返回视图。 NumPy的这种限制 - 一个非常难以删除的限制! - 冒泡到Pandas,导致DataFrames在索引不能表达为基本切片时返回副本。

不同的方法及其时代(完整性)

我已经接受了@ unutbu的答案,但我认为展示我创建的两个函数(和@ unutbu)及其不同的%timeit值以防任何人想要使用它可能是有价值的:

创建df_listmy_index

dfs = []
for i in range(5):
    tmp = pandas.DataFrame( numpy.random.randn(1000, 4), 
                            columns = list(itertools.islice(columns, 4)), 
                            index = pandas.DatetimeIndex(start = '01/01/2000', 
                                                         freq = 'b', 
                                                         periods = 1000)
    )

    dfs.append(tmp)

ind = range(0, 1000, 2)
my_index = tmp.index[ind].copy()

3种不同的实现方式

def join_on_index_a(df_list, index):
    return pandas.concat( 
                          map( lambda x: x.reindex(index), df_list), 
                          axis = 1
    )

#@unutbu's implementation
def join_on_index_b(df_list, index):
    result = dfs[0].reindex(index)
    for df in dfs[1:]:
        result = result.join(df, how='inner')
    return result

def join_on_index_c(df_list, index):
    return pandas.concat( map( lambda x: x.loc[index, :], df_list), axis = 1)

使用iPython %timeit的结果

In [49]: %timeit join_on_index_a(dfs, my_index)
1000 loops, best of 3: 1.85 ms per loop

In [50]: %timeit join_on_index_b(dfs, my_index)
100 loops, best of 3: 1.94 ms per loop

In [51]: %timeit join_on_index_c(dfs, my_index)
100 loops, best of 3: 21.5 ms per loop
1 为pandas.DataFrame复制GROUP_CONCAT

我有一个pandas DataFrame df: 我想找到或编写一个函数来返回我将在MySQL中使用以下命令返回的DataFrame: 为了以下结果: 通过迭代行并添加到字典,我可以想到通过讨厌的方式来实现这一点,但必须有更好的方法。 ...

2 Concat关于缺失索引的两个DataFrame

我有两个DataFrames,并且只想在第一个没有包含索引的行上使用第二个。 最有效的方法是什么? 例: 回顾:我需要添加df_2的行,其索引不在df_1 。 编辑 去除某些指标df_2说明一个事实,即所有指数df_1中没有涉及的df_2 。 ...

3 Pandas-具有单个索引的Concat多索引

我有一个看起来像这样的数据框: 和df.groupby(level = 0).sum()给我这个: 我想产生这个: Month索引的值是一个空字符串。 concat不会按照我的意愿退出工作,它给出了: ...

2017-06-23 21:26:08 1 582   pandas
4 Dataframe 的多索引设置 - pandas/Jupyter

将列表转换为字典 创建标签 """示例数据格式""" 我得到的格式: 我要生成的格式: """ 问题:我得到的标签输出为: 因此,数据帧中的每一行都会重复数据帧的值。 我想将标签输出的唯一值作为数据框中行的单行获取,格式如下: 所以我不希望行在每一行中重复相同的值。 ...

7 Pandas 多索引 DataFrame 转 JSON

我有一个多索引数据框,如下所示: 我想将其转换为类似于下面的 JSON。 我试过类似df.to_json(orient='index') ,它返回一个错误。 并且使用reset_index()不会返回我想要的层次结构! 谢谢您的帮助。 ...

8 pandas:用loc迭代DataFrame索引

我似乎无法找到.loc行为背后的原因。 我知道它是基于标签的,所以如果我遍历Index对象,下面的最小例子应该可行。 但事实并非如此。 我当然用Google搜索,但我需要一些已经掌握索引的人的其他解释。 import datetime import pandas as pd dict_ ...

9 重命名 pandas.concat 的 DataFrame 输出上的列

我正在通过连接其他 DataFrame 的列来构建一个新的 DataFrame,如下所示: 我想所有的列重命名pairs数据帧到标的证券的象征。 在 concat 方法调用期间有没有办法做到这一点? 通读这里方法的文档http://pandas.pydata.org/pandas-docs/ve ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM