在熊猫数据框中组合字符串在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循环中只工作一次[重复]的主要内容,如果未能解决你的问题,请参考以下文章