在熊猫数据框中组合字符串在while-if-elif循环中只工作一次[重复]

Posted

技术标签:

【中文标题】在熊猫数据框中组合字符串在while-if-elif循环中只工作一次[重复]【英文标题】:Combining strings in a pandas dataframe works just once in a while-if-elif loop [duplicate] 【发布时间】:2019-12-16 03:24:59 【问题描述】:

我有一个包含重复字符串的列 (name) 的数据框,我想将另一列 (reports) 中的值与“名称”中的相同值连接到一个单元格中。

我以为我会通过 while-if-elif 循环到达那里,但尤其是串联仅在第一个循环中有效。我就是想不通为什么!?

#example dataframe
data = 'name': ['Jason', 'Molly', 'Tina', 'Jake', 'Amy', 'Amy', 'Jake'], 
        'year': [2012, 2012, 2013, 2014, 2014, 2014, 2014], 
        'reports': ['Hallo', 'how are', 'you', 'not so', 'foo', 'damn it', 'bar']
df = pd.DataFrame(data)
df['index'] = df.index

#sorting to make the loop work (kept the original index just in case...)
dfSort = df.sort_values(['name'], ascending = True)
dfSort.astype('str')
dfSort.reset_index(inplace = True, drop = True)

#setting thins up
dfSorted = dfSort.copy()
num = df['name'].count()
i = 0
j = 1
dfNew = dfSorted.loc[:0, :]

#loop
while j < num:
    x = dfSorted.iloc[i:i+1, :1].values
    y = dfSorted.iloc[j:j+1, :1].values
    firstValue = dfSorted.iloc[i:i+1, 2:3].values
    nextValue = dfSorted.iloc[j:j+1, 2:3].values
    print(x, y, firstValue, nextValue, i, j) #just to see what's going on

    if x != y:
        NewRow = dfSorted.iloc[j:j+1, :]
        dfNew = pd.concat([dfNew, NewRow])
        i = j
        j += 1

    elif x == y:
        dfNew.iloc[i:i+1, :] = dfSorted.iloc[i:i+1, :]
        dfNew.iloc[i:i+1, 2:3] = firstValue + ', ' + nextValue

        j += 1
        print('done')#just to see it actually finished the elif-statement
dfNew.head()

dfNew 应该有 Amy"foo, damn it"Jake"not so, bar" 并删除重复的行并保留其他所有内容。 我确信这是一个简单的错误,但我只是没有看到它。

【问题讨论】:

也提供您的预期输出。如果 else 循环,这很可能不需要一段时间。 Pandas 提供了很多功能。 你可能想要df.groupby(['name', 'year'], as_index=False).agg(', '.join) 【参考方案1】:

这就是你要找的吗?

dfNew = df.groupby(['name', 'year'], as_index=False)['reports'].agg(list)
dfNew['reports'] = dfNew['reports'].str.join(', ')
    name    year    reports
0   Amy     2014    foo, damn it
1   Jake    2014    not so, bar
2   Jason   2012    Hallo
3   Molly   2012    how are
4   Tina    2013    you

【讨论】:

是的!天哪,这么简单...谢谢! 只是提高了我的理解力。 while循环的问题在哪里? @MarkusKrohn 我很不擅长使用循环,所以可能无法帮助您解决这个问题。不过,在大多数情况下,使用 pandas 库的矢量化函数比遍历每一行要高效得多。

以上是关于在熊猫数据框中组合字符串在while-if-elif循环中只工作一次[重复]的主要内容,如果未能解决你的问题,请参考以下文章

从熊猫数据框中的地址中删除分数

检查字符串是不是在熊猫数据框中

从熊猫数据框中的单词中删除子字符串

如何更改订单列并将它们组合在一个pandas数据框中?

替换熊猫数据框中部分匹配字符串的列名

在熊猫数据框中替换特殊字符