将多个值添加到列中 - Pandas
Posted
技术标签:
【中文标题】将多个值添加到列中 - Pandas【英文标题】:Adding Multiple Values into a Column - Pandas 【发布时间】:2019-10-20 05:55:21 【问题描述】:我有两个 pandas 数据框,我试图将它们合并到它们的 ID 号上。但是在 df1 中,ID 被多次使用,而在 df2 中,它只被使用一次。因此,我希望最终的数据框包含用逗号分隔的所有结果,并在其前面有一个索引值。我做了一个简单的例子来帮助我解释我在问什么。
df1:
df2:
合并目标:
我尝试过像往常一样合并它们:
MergedGoal= pd.merge(df1, df2, on='ID', how='left')
但是我得到一个 ID 的关键错误,可能是因为有重复。我怎样才能将它们加在一起?如果有人也可以给我一些关于如何为每个增加的价值添加索引的见解,那将是惊人的。但是,如果不能添加完全没问题的索引号,我只需要在同一个条目中用逗号分隔的所有值。
【问题讨论】:
请不要图片,以文本形式发布数据 为什么图片有问题? meta.***.com/questions/285551/… 哦,我明白为什么图片不好了 当然,请花时间阅读how to provide a great pandas example 上的这篇文章以及如何提供minimal, complete, and verifiable example 并相应地修改您的问题 【参考方案1】:我通过以下方式创建了 df1:
df1 = pd.DataFrame(data=[
[ 1, 'Manchester', 'NH', 3108 ],
[ 1, 'Bedford', 'NH', 3188 ],
[ 6, 'Boston', 'MA', 23718 ],
[ 1, 'Austin', 'TX', 20034 ]],
columns=['ID', 'City', 'State', 'Zip'])
df1.Zip = df1.Zip.astype(str).str.zfill(5)
请注意,我更改了源 Zip(如我所见,它们是“普通的” 整数)到一个字符串,因为你想有前导零。
创建 df2 我使用了:
df2 = pd.DataFrame(data=[[ 1, 'Best Cities', 'xxx' ], [ 6, 'Worst Cities', 'yyy' ]],
columns=['ID', 'Title', 'Description'])
作为准备步骤,让我们定义一个函数,它将被使用 从 df1 聚合列:
def fn(src):
lst = [ f'idx) val' for idx, val in enumerate(src, start=1) ]
return ', '.join(lst)
此函数的第一步是列表推导,其中 enumerate 遍历 src(当前列的内容 在当前组中)和替补:
idx - 当前元素索引,但从 1 开始, val - 当前元素本身。结果项的格式化执行f-string。 结果是一个列表,例如城市名称前有数字。
return 语句将此列表连接成一个字符串,插入 ", " 他们之间。
例如对于 ID == 1 和 City 列的组,源值为:
[ 'Manchester', 'Bedford', 'Austin' ]
结果是:
1) Manchester, 2) Bedford, 3)Austin
.
而实际的处理可以用单个指令来执行:
pd.merge(df2, df1.groupby('ID').agg(fn), how='left',
left_on='ID', right_index=True).fillna('')
如你所见:
我恢复了合并 DataFrame 的顺序。这样结果 包含来自 df2 的第一列,然后来自 df1。 来自 df1 的 City、State 和 Zip 列在前 按 ID 分组并使用 fn 函数聚合。 然后将它们与 df2 合并。 我添加了 fillna('') 以用空字符串替换 NaN 值, 如果 ID 仅存在于 df2 中,则会发生这种情况。【讨论】:
嘿,非常感谢!它正是我需要的。我只是想了解 def fn(src) 函数的工作原理。我对 Python 还是有点陌生,你认为你可以用几句话解释它的作用,以便我更好地了解实际发生的事情吗? 我添加了聚合函数的描述(fn)。也许你应该阅读一些关于 list comprehensions 和 f-strings 的内容。搜索网络,你肯定会找到很多描述,甚至在 *** 上。以上是关于将多个值添加到列中 - Pandas的主要内容,如果未能解决你的问题,请参考以下文章
Power Query:当特定值出现在另一列中时如何将一个添加到列中
Pandas 将具有多个值的行数据合并到列的 Python 列表中