【问题标题】:Unable to access list from csv file using pandas无法使用熊猫从 csv 文件访问列表
【发布时间】:2020-10-05 04:46:46
【问题描述】:

我的 csv 文件中有以下内容,我正在尝试使用 pandas 从 csv 中读取最后一列。在成功获取最后一列 x2 之后。我无法从输出中访问该列。相反,如果我尝试索引 x2 列,我会得到行。但我想要专栏。

CSV 文件:

symbol,close,low,high,x0,x1,x2
ACC,-1.41,1241.5,1270.0,-1.41,"[1221241.5, 1270, -1.41]","[1241.5, 1270, -1.41]"
ADANIPORTS,-1.61,336.85,346.85,-1.61,"[336.85, 346.85, -1.61]","[336.85, 346.85, -1.61]"
ADANITRANS,3.45,202.8,211.2,3.45,"[202.8, 211.2, 3.45]","[202.8, 211.2, 3.45]"

代码

import pandas as pd
df = pd.read_csv("tickerdb.csv", index_col=0)
print((df.iloc[:, -1]))

输出

symbol
ACC           [1241.5, 1270, -1.41]
ADANIPORTS       [336.85, 346.85, -1.61]
ADANITRANS          [202.8, 211.2, 3.45]

我尝试访问列表中的列,但我得到的是行。

print((df.iloc[:, -1][1]))

新输出:

[336.85, 346.85, -1.61]

但预期的输出是列表中的一列,而不是行:

1270
346.85
211.2

如果我能以某种方式得到,我也可以接受的第二个解决方案

#Current output from last column using df.iloc
ACC           [1241.5, 1270, -1.41]
ADANIPORTS       [336.85, 346.85, -1.61]
ADANITRANS          [202.8, 211.2, 3.45]

#If I can get like below for x2 column is also fine for me.
symbol        low     high    change
ACC           1241.5  1270    -1.41
ADANIPORTS    336.85  346.85  -1.61
ADANITRANS    202.8   211.2    3.45

以上两种解决方案中的任何一种都对我有好处。提前感谢您的帮助。

【问题讨论】:

  • 您在寻找df.highdf['high']
  • 不,我希望从我的 csv 列 x2 打印整列输出。即我正在寻找 x2[1] 的列
  • 使用@Sushanth 提示,这可以通过df.x2.apply(lambda row: row[1]) 解决
  • 您希望输出为第二个解决方案的新数据框吗?

标签: python pandas csv data-analysis


【解决方案1】:

如果您调用 df.head(),您将看到您有 6 列数据,但最后 2 列(x1 和 x2)包含已通过使用引号转换为字符串的 Python 列表行:

“[336.85, 346.85, -1.61]”

是第二行 x2 列的值。

从您想要的输出中,我认为您想要的是在 x2 列的每一行的索引 1 处获取值(如果该行是列表,而不是看起来像列表的字符串)。

我认为最好的办法是考虑重新格式化您的数据,但与此同时,这里有一个适合您的解决方法:

df = pd.read_csv("tickerdb.csv", index_col=0)

def get_middle_value(series):
    middle = [row.split(', ')[1] for row in series]
    return middle


print(get_middle_value(df.x2))






【讨论】:

  • 是的,它正确地给了我 x[2] 的列表。非常感谢。它有帮助。
  • 没问题 Vishal 很高兴我能帮上忙!
  • 只有一件事,我想知道我现在正在获取 x2[1] 的列表,因此将列表转换为新的数据框作为我想要的解决方案。我该怎么做..?
  • 您的意思是要将该列添加到数据框中吗?如果是这样,你可以写: df['middle_value'] = get_middle_value(df.x2) 但是如果你的意思是一个全新的数据框,你可以写: new_df = pd.DataFrame(get_middle_value(df.x2))
【解决方案2】:

试试这个:

from ast import literal_eval

df2 = pd.DataFrame(df.x2.apply(lambda x: literal_eval(x)).tolist(), columns=['low', 'high', 'change'])
df2.insert(0, column='symbol', value=df.symbol)

输出:

       symbol      low     high  change
0         ACC  1241.50  1270.00   -1.41
1  ADANIPORTS   336.85   346.85   -1.61
2  ADANITRANS   202.80   211.20    3.45

【讨论】:

  • 这是一个快速的解决方案。工作得很好。
猜你喜欢
  • 1970-01-01
  • 2023-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多