当前位置: 首页 > 知识库问答 >
问题:

Pandas DataFrame-将具有相同索引的一列值组合到列表中

谷越
2023-03-14

我讨论这个问题已经有一段时间了,但没有结果。这几乎是一个重复的问题,至少有一个其他的问题在这里,但我不能完全弄清楚如何做,确切地说,我正在寻找从网上相关的答案。

我有一个熊猫数据帧(我们称之为df),看起来像:

Name    Value        Value2
'A'     '8.8.8.8'    'x'
'B'     '6.6.6.6'    'y'
'A'     '6.6.6.6'    'x'
'A'     '8.8.8.8'    'x'

其中Name是索引。我想将其转换为类似以下内容:

Name    Value                     Value2
'A'     ['8.8.8.8', '6.6.6.6']    'x'
'B'     ['6.6.6.6']               'y'

因此,基本上,每个对应于相同索引的都应该组合到一个列表(或一个集合,或一个元组)中,该列表成为对应索引的。并且,如图所示,Value2在相似的索引行之间是相同的,因此它最终应该保持不变。

我所做的(成功地)就是弄清楚如何将Value列中的每个元素放入一个列表,其中包含:

df['Value'] = pd.Series([[val] for val in df['Value']])

在我在本文开头链接的问题中,推荐的将列与重复索引相结合的方法提供了一个使用df.groupby(df.index.sum()的解决方案。我知道除了df.index之外,我还需要一些东西作为groupby的参数,因为Value列被视为特殊列,我不确定应该用什么来代替sum(),因为这不是我想要的。

希望这是明确的我在寻找什么,让我知道,如果有什么我可以详细说明。我自己也尝试过简单地遍历数据帧,找到具有相同索引的行,将组合到一个列表中,并相应地更新df。在尝试使用这种方法一段时间后,我想我应该寻找一种更类似熊猫的方法来处理这个问题。

编辑:作为dermen回答的后续,这个解决方案有点奏效。似乎确实正确地连接到列表中。我意识到的一件事是,唯一的函数返回一个系列,而不是数据帧。此外,我在实际设置中确实有更多的列,而不仅仅是NameValueValue2。但是我认为我能够通过以下方法成功地解决这两个问题:

gb = df.groupby(tuple(df.columns.difference(['Value'])))
result = pd.DataFrame(gb['Value'].unique(), columns=df.columns)

其中,第一行为列列表减去列的groupby提供参数,第二行将unique返回的系列转换为数据帧,其列与df相同。

但我认为,所有这些都到位了(除非有人认为这有问题),几乎所有事情都按预期进行。不过,这里似乎有点不对劲。当我试图将它输出到一个带有到_csv文件时,顶部有重复的标题(但只有某些标题是重复的,据我所知,没有真正的模式)。另外,列表被截断,这可能是一个更容易解决的问题。csv输出电流如下所示:

Name    Value                   Value2    Name    Value2
'A'     ['8.8.8.8' '7.7.7.7'    'x'                     
'B'     ['6.6.6.6']             'y'

上面的内容看起来很奇怪,但这正是它在输出中的表现。请注意,与本文开头的示例相反,假设A值超过2个(因此我可以说明这一点)。当我对实际数据执行此操作时,列表在前4个元素之后被切断。


共有1个答案

张森
2023-03-14

我想你正在寻找使用熊猫。Series.unique。首先,使'Name'索引为列

df
#     Value2  Value
#Name              
#A         x    8.8
#B         y    6.6
#A         x    6.6
#A         x    8.8

df.reset_index(inplace=True)
#  Name Value2  Value
#0    A      x    8.8
#1    B      y    6.6
#2    A      x    6.6
#3    A      x    8.8

接下来调用Groupby并调用'Value'系列上的唯一的函数

gb = df.groupby(['Name','Value2'])
result = gb['Value'].unique()
result.reset_index(inplace=True) #lastly, reset the index
#  Name Value2       Value
#0    A      x  [8.8, 6.6]
#1    B      y       [6.6]

最后,如果您想再次使用'Name'作为索引,只需执行以下操作

result.set_index( 'Name', inplace=True)
#     Value2       Value
#Name                   
#A         x  [8.8, 6.6]
#B         y       [6.6]

作为后续行动,请确保在重置索引后重新分配结果

result = gb['Value'].unique()
type(result)
#pandas.core.series.Series

result = result.reset_index()
type(result)
#pandas.core.frame.DataFrame

您不想在此处使用CSV,因为列条目中有逗号。相反,另存为TSV时,您仍然使用相同的方法来_csv,只需更改separg:

result.to_csv( 'result.txt', sep='\t')

如果将result.txt作为TSV加载到EXCEL中,则

 类似资料:
  • 我有一个熊猫DF如下,我正在努力打印一个好看的格式。。。有人能告诉我如何从同一列值中组合这两个值吗? 我希望打印的

  • null 在Java8流中如何做到这一点? 我开始把它们放进桶里(见下文),但不确定从这里去哪里:

  • 问题内容: 我正在查看数据库中的一个表(我没有创建该表),我发现有两个完全相同的索引(我不知道为什么这样做)只是命名不同,这可以对桌子有负面影响吗? 拿这个例子表: 问题答案: 是的,它可以起作用。 当然,如果使用这两个索引,它们会占用磁盘和内存的额外空间。 但是,它们还会使查询优化器做更多的工作来计算每个SELECT期间每个索引的收益。您拥有的索引越多,需要比较的案例就越多。因此,消除真正的冗余

  • 问题内容: 从此列表: 我正在尝试创建: 被发现相同的任何值都被分组到其自己的子列表中。到目前为止,这是我的尝试,我在想应该使用循环吗? 问题答案: 有人提到它会得到 换句话说,当列表的编号不按顺序排列或为混乱列表时,该列表将不可用。 所以我有更好的答案来解决这个问题。

  • 问题内容: 我有以下格式的词典列表: 我想将此字典列表分组为一个字典,例如: 我目前所做的是,遍历所有字典并创建键列表,然后再次遍历该键以创建。我想知道是否有更简单的方法来完成此任务。有人可以帮忙吗? 问题答案: 谷歌的事情: python列表理解 python dict理解 蟒蛇星 python dict获取 python设置联合

  • 问题内容: 我有两个表,关键字和数据。 表关键字具有2列(id,关键字),表数据具有3列(id [keywords.id的外键,名称,值]。 我正在使用此查询: 它返回类似: 每个id的值可以为0到3(将来可能会更多)。 如何在同一行中检索具有相同ID的所有行? 喜欢 我想这样做是因为我希望能够对值进行排序。 问题答案: 像这样使用: 另外,您可能需要根据需要获取确切的值顺序。像这样: