【问题标题】:Looping through paired list to merge rows of Data Frame in python循环遍历配对列表以合并python中的数据框行
【发布时间】:2020-07-18 04:04:26
【问题描述】:

我有一个数据框,其中所有单元格都是字符串。我想遍历一个配对列表并连接数据框的行。

例如,我有一个如下所示的数据框:

df=[['7','4','5','',''],["","","",'7','4'],['9','4','7','8','4'],["","","",'7','5'],['4','8','5','4','6'],['4','9','41','74','20'],['4','Super','yes','0','9']]
df=pd.DataFrame(df)
df.astype('str')
print(df)
0   1   2   3   4   
7   4   5           
            7   4
9   4   7   8   4
            7   5
4   8   5   4   6
4   9   41  74  20

我想遍历下面的配对列表,其中第一个元素是开始和第二个结束。

list_index=[[1,3],[4,5]]

这是我的审判。我试图将列表更改为范围,以便我可以访问每个缩减的元素并遍历它们,但没有运气抛出TypeError: 'list' object cannot be interpreted as an integer

for row,index in df.iterrows():
    for i in range(len(list_index)):
        for j in range(list_index[i]):
            df[row,:] = df[row,:] + row 

最后,对于我上面的索引的开始和结束,我希望数据最终数据框看起来像这样:

0   1   2   3   4   
7   4   5           
9   4   7   787 445
44  89  541 474 620

我不确定如何在 python 中循环遍历列表的配对元素。谁能帮我解决这个问题?

【问题讨论】:

  • 嗨,我不明白你的输出。所以你想从第 1 行第 3 列 [1,3] 到第 4 行第 5 列 [4,5] 会发生什么?第 2 行中原始 df 的空单元格在哪里? [2,0:3]
  • 我认为您想要的输出存在缺陷。特别是,我觉得应该是9、4、7、787、445。如果我错了,请纠正我。
  • @Björn B,感谢您的回复。不,列根本不受影响。我想连接从 1 到 3 和 4 到 5 的数据框行。列根本不受影响,我想连接所有列的 1 和 3 以及 4 和 5 之间的行。
  • @Ramin Melikov 感谢您发现这一点。我现在已经编辑了。

标签: python list dataframe for-loop concatenation


【解决方案1】:

这是没有groupby的另一种解决方案

start_end = [[1,3],[4,5]]

new_df = pd.DataFrame()

for l in start_end:

    temp_df = df.iloc[l[0] : l[1] + 1,:].apply(lambda x : ''.join(x)).to_frame().transpose()

    new_df = pd.concat([new_df, temp_df], ignore_index = True)

new_df

【讨论】:

  • 这是完美的。非常感谢你。我现在明白它是如何工作的。 :)
【解决方案2】:
# this is an important step because we need a column to groupby
df['gb'] = 'gb'

start_end = [[1,3],[4,5]]

new_df = pd.DataFrame()

for l in start_end:

    temp_df = df.iloc[l[0] : l[1] + 1,:].groupby(['gb']).agg(lambda x : ''.join(x)).reset_index(drop = True)

    new_df = pd.concat([new_df, temp_df], ignore_index = True)

new_df

【讨论】:

  • 对此我感激不尽。我整天都在试图弄清楚这一点。太棒了,如果你能解释一下 lambda 函数是如何在这里工作的,我也可以对动态列数使用相同的逻辑吗?比如下次列数是三六列怎么办?
  • 我刚刚更新了代码。我删除了一些东西。现在,它可以对任意数量的列执行此操作。那是深夜,我不知道我在想什么,硬编码所有的列。 lambda 函数连接每列的所有分组单元格。如果你使用过 Oracle,它就像 listagg,在 SQLite 中它是 group_concat。
  • 感谢您的帮助。我现在正试图找到一种替代方法来解决这个问题。如果可能的话,你能帮我解决这个问题吗?我正在尝试学习如何使用 for 循环在 python 中实现类似的功能。提前感谢您的帮助。
  • 那里有一个 for 循环。你没看到吗?
猜你喜欢
  • 2021-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-31
  • 2021-01-19
  • 1970-01-01
  • 1970-01-01
  • 2021-02-08
相关资源
最近更新 更多