【问题标题】:feeding data present in series seperated by , into a columns of data frame将由 , 分隔的系列数据馈送到数据框的列中
【发布时间】:2017-01-30 07:29:12
【问题描述】:

我是python的初学者。我正在做一个项目,我有以下模式的数据:

json 文件中的数据如下所示:

"price_time":[1398823200,1403154000,1403247600,1403301600,1403380800],"price_value":[901,909,918,927,936],],"salesRank_value":[2176,2318,2192,1801,1829]

df.head() 命令如下所示:

>>> df.head() 
                                            1974-12-11 20:55:21
price_time    [1398823200, 1403154000, 1403247600, 140330160...
price_value   [901, 909, 918, 927, 936, 945, 954, 963, 972, ...
rating_time                                        [1475972640]
rating_value                                               [43]
review_count  [6558, 6560, 6561, 6562, 6564, 6566, 6568, 656...

df = pd.read_json('results.json')
In [] : print(df.head()) 
output : 
price_time       [1398823200, 1403154000, 1403247600, 140330160...
price_value      [901, 909, 918, 927, 936, 945, 954, 963, 972, ...
salesRank_value  [2176, 2318, 2192, 1801, 1829, 2207, 1757, 177...

我想将此数据转换为以下模式:

price_time   price_value  salesRank_value
1398823200   901          2176
1403154000   909          2318
1403247600   918          2192

等等…… 我写的代码在这里,但我无法得到想要的结果:

import pandas as pd


df1={}
df1['price_time'] = df.loc['price_time']
df1['price_value'] = df.loc['price_value']
print(df1)

output:
{'price_value': 1974-12-11 20:55:21    [901, 909, 918, 927, 936, 945, 954, 963, 972, ...
Name: price_value, dtype: object, 'price_time': 1974-12-11 20:55:21    [1398823200, 1403154000, 1403247600, 140330160...
Name: price_time, dtype: object}

【问题讨论】:

  • 您是要这样打印还是要以那样的方式将其存储在文件中或其他方式?(由于它们已经根据相应的位置存储在列表中,因此不需要排序)
  • 不,我不想那样打印它,我已经从 json 文件中导入了这些数据,我想以表格(有问题的所需模式)形式获取它,然后进一步分析它。
  • 您的 JSON 数据究竟是什么样的?你的df究竟是什么样的?也许打印df.head(10) 的结果并在这里分享。
  • 就像 juanpa.arrivillaga 说的,能否请您添加您的文件样本。
  • df.head(10) 给出的结果如下。它看起来与我在问题中提到的完全一样。 price_time [1398823200, 1403154000, 1403247600, 140330160... price_value [901, 909, 918, 927, 936, 945, 954, 963, 972, ... salesRank_value [2176, 2318, 17592, 2801, 2801, , 177...

标签: python json pandas


【解决方案1】:
price_time = [1398823200, 1403154000, 1403247600, 140330160]
price_value  =  [901, 909, 918, 927]
salesRank_value = [2176, 2318, 2192, 1801]

listdata = zip(price_time,price_value,salesRank_value)
print listdata

【讨论】:

  • 正如我所说我从 json 文件中导入数据,我没有你使用的格式的数据。就是这样:price_time [1398823200, 1403154000, 1403247600, 140330160...], price_value [901, 909, 918, 927, 936, 945, 954, 963, 972, ...], salesRank_value[2176, 2318 , 2192, 1801, 1829, 2207, 1757, 177...]...由于数据量很大,我无法单独编辑每个字段。
【解决方案2】:

我猜您将数据放在单个字符串中(行由换行符区分)或文件中,那么您可以使用以下一个衬里。 假设单个字符串变量 data=df.head() 中的数据如下所示:

'price_time       [1398823200, 1403154000, 1403247600]\nprice_value      [901, 909, 918]\nsalesRank_value  [2176, 2318, 2192]'

您可以使用以下方法获取所需的数组:

array=[a.split() for a in data.replace("[","").replace(",","").replace("]","").split('\n')]

输出(二维数组,每个内部数组包含每一行,第一个元素作为行名,其余作为数据):

[['price_time', '1398823200', '1403154000', '1403247600'], ['price_value', '901', '909', '918'], ['salesRank_value', '2176', '2318', '2192']]

如果文件 data.txt 中有这样的数据:

price_time       [1398823200, 1403154000, 1403247600]
price_value      [901, 909, 918]
salesRank_value  [2176, 2318, 2192]

然后使用以下内容:

array=[line.replace("[","").replace(",","").replace("]","").split() for line in open('data.txt')]

然后像以前一样在二维数组中再次输出:

[['price_time', '1398823200', '1403154000', '1403247600'], ['price_value', '901', '909', '918'], ['salesRank_value', '2176', '2318', '2192']]

对于您提供的json文件数据:

"price_time":[1398823200,1403154000,1403247600,1403301600,1403380800],"price_value":[901,909,918,927,936],"salesRank_value":[2176,2318,2192,1801,1829]

在不需要熊猫的情况下使用它:

array=[b.split() for b in  open('data.json').read().replace('"',"").replace(":["," ").replace("],","\n").replace(","," ").replace("]","").split('\n')]
print array

(有一种更简洁的方法可以删除非字母数字字符,但是因为我需要按照我的意愿格式化字符串,所以我使用了这个) 像前面二维数组一样的输出:

[['price_time', '1398823200', '1403154000', '1403247600', '1403301600', '1403380800'], ['price_value', '901', '909', '918', '927', '936'], ['salesRank_value', '2176', '2318', '2192', '1801', '1829']]

以表格形式查看结果:

for z in range(len(array[0])):
 temp=''
 for y in range(len(array)):
  temp+=array[y][z]+'\t'
 temp+='\n'
 print temp

输出:

price_time      price_value     salesRank_value

1398823200      901     2176

1403154000      909     2318

1403247600      918     2192

1403301600      927     1801

1403380800      936     1829

为了更漂亮的输出,使用这个:

s = [[str(e) for e in row] for row in array]
lens = [max(map(len, col)) for col in zip(*s)]
fmt = ' '.join('{{:{}}}'.format(x) for x in lens)
table = [fmt.format(*row) for row in s]
print '\n'.join(table)

输出:

price_time      1398823200 1403154000 1403247600 1403301600 1403380800
price_value     901        909        918        927        936
salesRank_value 2176       2318       2192       1801       1829 

【讨论】:

  • 谢谢。输出完全按照您给出的方式出现,您能告诉我如何以问题中提到的表格格式排列它。实际上,它代表的是,901 是这个特定产品在这个(1398823200)时间的价格值。我想重新排列数据,以便我可以轻松地进行可视化。我希望这对你有意义。
  • @kart 从技术上讲,这是一种表格形式。看,数组[0][1] 元素包含该商品的 price_time=1398823200,对于同一商品,数组[1][1] 包含商品 901 的价格值,数组[2][1] 包含 2176 作为销售排名该项目。而array[0][0] array[1][0] array[2][0]包含了它们各自的head。
  • @kart 添加了打印代码以向您展示它以表格形式显示的外观
  • @kart 我没有获得投票积分。如果你不想这样做也没关系:D
  • 我的声望低于 15 可能就是这个原因...但我做到了...无论如何...谢谢...
猜你喜欢
  • 2020-09-20
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 2016-05-25
  • 1970-01-01
  • 1970-01-01
  • 2023-01-28
  • 1970-01-01
相关资源
最近更新 更多