要列出的 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
。因此,如果数据中有int
和float
,则输出将有int
或float
,并且列将失去其原始数据类型。
考虑 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 for循环复制列以分隔数据帧,相应地重命名df