当前位置: 首页 > 面试题库 >

遍历行并扩展pandas数据框

濮阳唯
2023-03-14
问题内容

我的pandas数据框的列包含值或值列表(长度不等)。我想“扩展”行,因此列表中的每个值都变成列中的单个值。一个例子说明了一切:

dfIn = pd.DataFrame({u'name': ['Tom', 'Jim', 'Claus'],
 u'location': ['Amsterdam', ['Berlin','Paris'], ['Antwerp','Barcelona','Pisa'] ]})

    location     name
0   Amsterdam   Tom
1   [Berlin, Paris] Jim
2   [Antwerp, Barcelona, Pisa]  Claus

我想变成:

dfOut = pd.DataFrame({u'name': ['Tom', 'Jim', 'Jim', 'Claus','Claus','Claus'],
u'location': ['Amsterdam', 'Berlin','Paris', 'Antwerp','Barcelona','Pisa']})

    location     name
0   Amsterdam   Tom
1   Berlin   Jim
2   Paris   Jim
3   Antwerp Claus
4   Barcelona   Claus
5   Pisa    Claus

我首先尝试使用Apply,但据我所知不可能返回多个Series。遍历似乎是诀窍。但是下面的代码给了我一个空的数据框…

def duplicator(series):
    if type(series['location']) == list:
        for location in series['location']:
            subSeries = series
            subSeries['location'] = location
            dfOut.append(subSeries)
    else:
        dfOut.append(series)

for index, row in dfIn.iterrows():
    duplicator(row)

问题答案:

如果您返回一个index位置列表的dfIn.apply系列,则将这些系列整理到一个表中:

import pandas as pd
dfIn = pd.DataFrame({u'name': ['Tom', 'Jim', 'Claus'],
                     u'location': ['Amsterdam', ['Berlin','Paris'],
                                   ['Antwerp','Barcelona','Pisa'] ]})

def expand(row):
    locations = row['location'] if isinstance(row['location'], list) else [row['location']]
    s = pd.Series(row['name'], index=list(set(locations)))
    return s

In [156]: dfIn.apply(expand, axis=1)
Out[156]: 
  Amsterdam Antwerp Barcelona Berlin Paris   Pisa
0       Tom     NaN       NaN    NaN   NaN    NaN
1       NaN     NaN       NaN    Jim   Jim    NaN
2       NaN   Claus     Claus    NaN   NaN  Claus

然后,您可以堆叠此DataFrame以获得:

In [157]: dfIn.apply(expand, axis=1).stack()
Out[157]: 
0  Amsterdam      Tom
1  Berlin         Jim
   Paris          Jim
2  Antwerp      Claus
   Barcelona    Claus
   Pisa         Claus
dtype: object

当您需要一个DataFrame时,这是一个Series。稍微按摩一下即可reset_index得到所需的结果:

dfOut = dfIn.apply(expand, axis=1).stack()
dfOut = dfOut.to_frame().reset_index(level=1, drop=False)
dfOut.columns = ['location', 'name']
dfOut.reset_index(drop=True, inplace=True)
print(dfOut)

产量

    location   name
0  Amsterdam    Tom
1     Berlin    Jim
2      Paris    Jim
3  Amsterdam  Claus
4    Antwerp  Claus
5  Barcelona  Claus


 类似资料:
  • 问题内容: 我正在尝试遍历Python Pandas数据框的行。在数据帧的每一行中,我试图通过其列名引用行中的每个值。 这是我所拥有的: 我使用了这种方法来进行迭代,但这只是解决方案的一部分- 在每次迭代中选择一行后,如何通过列名称访问行元素? 这是我想做的事情: 我的理解是该行是熊猫系列。但是我无法索引该系列。 在遍历行的同时可以使用列名吗? 问题答案: 我也喜欢 由于行是一个名为元组,如果你打

  • 主要内容:内置迭代方法,迭代返回副本遍历是众多编程语言中必备的一种操作,比如 Python 语言通过 for 循环来遍历列表结构。那么 Pandas 是如何遍历 Series 和 DataFrame 结构呢?我们应该明确,它们的数据结构类型不同的,遍历的方法必然会存在差异。对于 Series 而言,您可以把它当做一维数组进行遍历操作;而像 DataFrame 这种二维数据表结构,则类似于遍历 Python 字典。 在 Pandas

  • 问题内容: 我正在尝试遍历文件夹和所有子文件夹以查找某些文件类型的所有文件-例如,仅.mp4,.avi,.wmv。 这是我现在拥有的,它遍历所有文件类型: 谢谢! 问题答案: 您可以使用which采取路径并将文件扩展名从其末尾分割:

  • 问题内容: 如果我有这样的话: 给出以下结构: 如何将其扩展到以下内容? 问题答案: 您可以用来遍历每一行,并使用列表推导将数据重塑为所需的形式: 产量 ivakar的解决方案,是最快的: 这是用于上述基准测试的设置:

  • 我要做的是遍历Firebase数据库,看看是否有某个值,如果有,则什么也不做,如果没有,则向节点添加另一个值。 我的Firebase收藏是这样的: 同样,我不确定这是不是正确的代码,但它是类似的。我用这个答案作为帮助,但不能根据我的需要调整它:Firebase/Android如何获得子键和值? 还有一个问题,我得到的是,我的数据库是无限填一遍又一遍。

  • 问题内容: 我有一个日期和字符串类似于的熊猫数据框: 我需要将其扩展/转换为以下内容,在“ 开始” 和“ 结束” 列之间填写几周(W-SAT),然后向前填充“ 注释” 和“ 项目”中 的数据: 用pandas做到这一点的最佳方法是什么?某种多索引适用吗? 问题答案: 您可以遍历每一行并创建一个新的数据框,然后将它们连接在一起

  • 只要需要并行的程序逻辑可以划分为不同的职责,并分配给各个独立的step,那么就可以在单个进程中并行执行。并行Step执行很容易配置和使用,例如,将执行步骤(step1,step2)和步骤3step3并行执行,则可以向下面这样配置一个流程: <job id="job1"> <split id="split1" task-executor="taskExecutor" next="step4"

  • 我是python的新手,正在学习使用dataframes和列表理解。我有以下数据帧: 现在我想把每个子列表拆分成单词。对于一个列表列表,我可以使用 但是我如何在数据帧上迭代它呢?我想我必须构建一个列表理解,然后使用方法来超越?但我不知道怎么做。我将为单个列表构建列表理解,如下所示: