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

Pandas DataFrame列到列表[重复]

冉昊
2023-03-14

我从一个列中提取数据的子集,基于满足另一个列中的条件。

我可以得到正确的值,但它在pandas.core.frame.DataFrame中。如何将其转换为列表?

import pandas as pd

tst = pd.read_csv('C:\\SomeCSV.csv')

lookupValue = tst['SomeCol'] == "SomeValue"
ID = tst[lookupValue][['SomeCol']]
#How To convert ID to a list

共有3个答案

东方森
2023-03-14

您可以使用熊猫。Series.tolist

例如:

import pandas as pd
df = pd.DataFrame({'a':[1,2,3], 'b':[4,5,6]})

运行:

>>> df['a'].tolist()

你会得到

>>> [1, 2, 3]

韦鸣
2023-03-14

我想澄清几件事:

  1. 正如其他答案所指出的,最简单的方法是使用pandas.Series.tolist()。我不知道为什么得票最多的答案是使用pandas.Series.values.tolist(),因为据我所知,它增加了语法/混乱,但没有额外的好处。
  2. tst[lookupValue][['SomeCol']]是一个数据帧(如问题中所述),而不是一个系列(如问题注释中所述)。这是因为tst[lookupValue]是一个数据帧,使用['SomeCol']]对其进行切片会要求列列表(该列表恰好长度为1),从而返回一个数据帧。如果删除额外的一组括号,如在tst[lookupValue]['SomeCol']中所述,那么您只需要这一列,而不是一列列表,这样您就可以得到一个序列。
  3. 您需要一个系列来使用pandas.series.tolist(),因此在本例中,您肯定应该跳过第二组括号。仅供参考,如果您最终得到的是一列数据帧,而这种情况很难避免,您可以使用pandas.dataframe.squence()将其转换为一个系列。
  4. tst[lookupValue]['SomeCol']通过链式切片获取特定列的子集。它切片一次以获得只剩下特定行的数据帧,然后再次切片以获得特定列。您可以在这里进行操作,因为您只是阅读,而不是写作,但是正确的方法是tst.loc[lookupValue,'SomeCol'](返回一个系列)。
  5. 使用#4中的语法,您可以合理地在一行中完成所有操作:ID=tst.loc[tst['SomeCol']=='SomeValue','SomeCol'].tolist()

演示代码:

import pandas as pd
df = pd.DataFrame({'colA':[1,2,1],
                   'colB':[4,5,6]})
filter_value = 1

print "df"
print df
print type(df)

rows_to_keep = df['colA'] == filter_value
print "\ndf['colA'] == filter_value"
print rows_to_keep
print type(rows_to_keep)

result = df[rows_to_keep]['colB']
print "\ndf[rows_to_keep]['colB']"
print result
print type(result)

result = df[rows_to_keep][['colB']]
print "\ndf[rows_to_keep][['colB']]"
print result
print type(result)

result = df[rows_to_keep][['colB']].squeeze()
print "\ndf[rows_to_keep][['colB']].squeeze()"
print result
print type(result)

result = df.loc[rows_to_keep, 'colB']
print "\ndf.loc[rows_to_keep, 'colB']"
print result
print type(result)

result = df.loc[df['colA'] == filter_value, 'colB']
print "\ndf.loc[df['colA'] == filter_value, 'colB']"
print result
print type(result)

ID = df.loc[rows_to_keep, 'colB'].tolist()
print "\ndf.loc[rows_to_keep, 'colB'].tolist()"
print ID
print type(ID)

ID = df.loc[df['colA'] == filter_value, 'colB'].tohtml" target="_blank">list()
print "\ndf.loc[df['colA'] == filter_value, 'colB'].tolist()"
print ID
print type(ID)

结果:

df
   colA  colB
0     1     4
1     2     5
2     1     6
<class 'pandas.core.frame.DataFrame'>

df['colA'] == filter_value
0     True
1    False
2     True
Name: colA, dtype: bool
<class 'pandas.core.series.Series'>

df[rows_to_keep]['colB']
0    4
2    6
Name: colB, dtype: int64
<class 'pandas.core.series.Series'>

df[rows_to_keep][['colB']]
   colB
0     4
2     6
<class 'pandas.core.frame.DataFrame'>

df[rows_to_keep][['colB']].squeeze()
0    4
2    6
Name: colB, dtype: int64
<class 'pandas.core.series.Series'>

df.loc[rows_to_keep, 'colB']
0    4
2    6
Name: colB, dtype: int64
<class 'pandas.core.series.Series'>

df.loc[df['colA'] == filter_value, 'colB']
0    4
2    6
Name: colB, dtype: int64
<class 'pandas.core.series.Series'>

df.loc[rows_to_keep, 'colB'].tolist()
[4, 6]
<type 'list'>

df.loc[df['colA'] == filter_value, 'colB'].tolist()
[4, 6]
<type 'list'>
督坚白
2023-03-14

您可以使用Series.to_list方法。

例如:

import pandas as pd

df = pd.DataFrame({'a': [1, 3, 5, 7, 4, 5, 6, 4, 7, 8, 9],
                   'b': [3, 5, 6, 2, 4, 6, 7, 8, 7, 8, 9]})

print(df['a'].to_list())

输出:

[1, 3, 5, 7, 4, 5, 6, 4, 7, 8, 9]

要删除重复项,您可以执行以下操作之一:

>>> df['a'].drop_duplicates().to_list()
[1, 3, 5, 7, 4, 6, 8, 9]
>>> list(set(df['a'])) # as pointed out by EdChum
[1, 3, 4, 5, 6, 7, 8, 9]
 类似资料:
  • < code>list_of_lists=[[1,2,3],[4,5,6]] < br > < code > list _ to _ add =[" A "," B "," C"] 我希望结果是list_of_lists会变成: 谢谢!

  • 我有一份这种格式的清单 我想用这些信息创建一个数据框架,其中一个列名为“情绪”,另一个列名为“分数” 数据帧: 我不知道如何将我的列表转换为具有这种结构的数据格式

  • 我的DTO中有一个字符串列表,我想把它映射成一个对象列表,在映射器中我使用服务通过这个字符串获取对象,但我有以下错误 考虑声明/实现一个映射方法:“java.util.list map(java.util.list value)”。

  • 我使用的是mapstruct 1.4.2.final。我有一个这样的问题: Business1 id有许多Business2 id关系。我想像RelationDTO一样使用DTO来记录。 谢谢你的留言。

  • 我找不到任何关于以下三种获取列名列表的方法中的一种比其他方法更好的资料。第一个也是最简单的,似乎适用于我当前的示例。有什么理由我不应该用它吗? 更新 此处提供与性能相关的答案:https://stackoverflow.com/A/27236748/605328

  • 我有一个类型的变量,其中item如下所示: 我想将其重新排序为,其中键是customerId,然后值是具有该客户ID的所有项的列表。