要列出Pandas DataFrame列

我正在根据另一列中的条件从一列中提取数据子集。

我可以得到正确的值,但它在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
635687 次浏览

你可以使用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]
如果所有的数据都是相同的dtype,上面的解决方案是好的。Numpy数组是同构容器。当你执行df.values时,输出是numpy array。因此,如果数据中有intfloat,那么输出将有intfloat,列将失去它们原始的dtype。 考虑df

a  b
0  1  4
1  2  5
2  3  6


a    float64
b    int64

如果你想保持原始的dtype,你可以这样做

row_list = df.to_csv(None, header=False, index=False).split('\n')

这将以字符串的形式返回每一行。

['1.0,4', '2.0,5', '3.0,6', '']

然后拆分每一行得到list of list。拆分后的每个元素都是unicode。我们需要转换它所需的数据类型。

def f(row_str):
row_list = row_str.split(',')
return [float(row_list[0]), int(row_list[1])]


df_list_of_list = map(f, row_list[:-1])


[[1.0, 4], [2.0, 5], [3.0, 6]]

你可以使用pandas.Series.tolist

例如:

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

运行:

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

你会得到

>>> [1, 2, 3]

我想澄清几件事:

    正如其他答案所指出的,最简单的方法就是使用 pandas.Series.tolist()。我不知道为什么投票最多的人会回答 首先使用pandas.Series.values.tolist(),因为据我所知,它增加了语法/混乱,没有额外的好处
  1. tst[lookupValue][['SomeCol']]是一个数据帧(如在 问题),而不是一个系列(如对问题的评论所述)。这是因为tst[lookupValue]是一个数据帧,用[['SomeCol']]对其进行切片 一个列的列表(该列表的长度恰好为1),返回一个数据帧。如果你 去掉多余的一组括号,如 tst[lookupValue]['SomeCol'],那么你只是在要求那一个 列,而不是列的列表,因此您将得到一个序列 你需要一个系列来使用pandas.Series.tolist(),所以你应该 在这种情况下,一定要跳过第二组括号。供你参考,如果你 以单列数据框架结束,这是不容易避免的 像这样,你可以使用pandas.DataFrame.squeeze()将其转换为 李系列。< / >
  2. tst[lookupValue]['SomeCol']获取特定列via的子集 链接切片。它切片一次,得到一个只有特定行的数据框架 左边,然后再切片得到某一列。你可以得到 既然你只是在阅读,而不是在写作,就把它放在这里吧 正确的方法是tst.loc[lookupValue, 'SomeCol'](返回一个系列)
  3. 使用#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'].tolist()
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'>