要列出的 Pandas DataFrame 列[重复]

Posted

技术标签:

【中文标题】要列出的 Pandas DataFrame 列[重复]【英文标题】:Pandas DataFrame column to list [duplicate] 【发布时间】:2014-07-08 01:51:22 【问题描述】:

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

我可以取回正确的值,但它位于 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

【问题讨论】:

我很犹豫要不要编辑一个这么老且有这么多观点的问题,但应该指出的是,虽然标题谈到了“要列出的数据框”,但问题是关于“要列出的系列列表”。请注意,tst 是一个数据框,tst['SomeCol'] 是一个系列。区别在于 tolist() 方法直接作用于系列,而不是数据帧。 请注意,使用 DataFrame 实际上可能比使用列表更方便。 如果您来这里是为了了解如何将 DATAFRAME 转换为列表(列表),请查看此主题:***.com/questions/28006793/… 【参考方案1】:

您可以使用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]

【讨论】:

谢谢你的作品!我想从 ID 列表中删除重复项。我尝试使用 set(ID) 但出现错误说 TypeError: unhashable type: 'list' 你可以做list(set(df['a']) @EdChum,谢谢,这样肯定更好。 这里有问题。我在 pandas 数据框中的数据同时具有 int64 和 float64。当我执行 df.values 时,它将 int64 转换为 float64,并且整个数组的 dtype 为 float64。任何线索如何处理这个? @ShikharDua,您可能应该将此作为一个单独的问题提出。【参考方案2】:

我想澄清几点:

    正如其他答案所指出的,最简单的方法是使用 pandas.Series.tolist()。我不知道为什么票数最高的答案 以使用 pandas.Series.values.tolist() 为先导,因为据我所知,它增加了语法/混乱,但没有额外的好处。 tst[lookupValue][['SomeCol']] 是一个数据框(如 问题),而不是系列(如对该问题的评论中所述)。这是因为tst[lookupValue] 是一个数据框,使用[['SomeCol']] 对其进行切片要求 列列表(该列表的长度恰好为 1),导致返回数据帧。如果你 删除额外的一组括号,如 tst[lookupValue]['SomeCol'],那么你只需要那个 列而不是列列表,因此您会得到一个系列。 你需要一个系列才能使用pandas.Series.tolist(),所以你应该 在这种情况下,一定要跳过第二组括号。仅供参考,如果你 最终得到一个不容易避免的单列数据框 像这样,您可以使用pandas.DataFrame.squeeze() 将其转换为 一个系列。 tst[lookupValue]['SomeCol'] 正在通过 链式切片。它切片一次以获取仅包含某些行的数据帧 左,然后再次切片以获取特定列。你可以得到 把它放在这里,因为你只是在阅读,而不是在写作,但是 正确的做法是tst.loc[lookupValue, 'SomeCol'](返回一个系列)。 使用 #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'>

【讨论】:

【参考方案3】:

您可以使用pandas.Series.tolist

例如:

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

运行:

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

你会得到

>>> [1, 2, 3]

【讨论】:

【参考方案4】:

如果所有数据都具有相同的 dtype,则上述解决方案很好。 Numpy 数组是同构容器。当您执行df.values 时,输出为numpy array。因此,如果数据中有intfloat,则输出将有intfloat,并且列将失去其原始数据类型。 考虑 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', '']

然后拆分每一行以获得列表列表。拆分后的每个元素都是一个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]]

【讨论】:

更简单的方法就是做df['b'].values。如果您在使用 .values 之前选择该列,它将避免转换并保留原始数据类型。这也更有效率。 the above solution 是哪一个?所有答案都出现在这个答案之上。谢谢!

以上是关于要列出的 Pandas DataFrame 列[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Pandas把dataframe的索引复合索引变换为数据列:包含单索引到单列(重命名)复合索引到多数据列复合索引的其中一个水平变换为数据列

要列出的 Pandas 数据框系列 - 抑制浮点科学记数法

Pandas for循环复制列以分隔数据帧,相应地重命名df

Pandas Dataframe 根据列值将值展平到单元格

如何使用字典键和值重命名 pandas DataFrame 中的列?

如何使用 Pandas 重命名重置索引上的多个列