吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2017|回复: 13
收起左侧

[求助] python列表DataFrame&Series问题

[复制链接]
lizy169 发表于 2022-4-18 21:34
25吾爱币
万能的吾爱,请教各路大神:

image.png

我想把它转成
image.png

请问如何操作???方法越多越好

转成字符串来乘,然后再转回float,结果却不是我需要的。。。

df['z_price'] = df['price'].astype(str)
data = []
for x, y in zip(df['z_price'], df['quantity']):
    list_dat = x * y
    data += list_dat
print(data)
['2', '.', '1', '2', '.', '1', '2', '.', '2', '2', '.', '3', '2', '.', '3', '2', '.', '3', '1', '.', '8']

请各路大神指点,谢谢

最佳答案

查看完整内容

一: 二(生成器): [mw_shl_code=python,true]import pandas as pd def repeat(data:pd.DataFrame): for item in data.iterrows(): yield from ...

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

zxc9989 发表于 2022-4-18 21:34
本帖最后由 zxc9989 于 2022-4-19 10:26 编辑

一:
[Python] 纯文本查看 复制代码
import pandas as pd

data = pd.DataFrame({'price':[2.1,2.2,2.3,1.8], 'quantity':[2,1,3,1]})
new_data = data['price'].repeat(data['quantity'])
new_data.index = range(1, new_data.shape[0]+1)
print(new_data)


二(生成器):
[Python] 纯文本查看 复制代码
import pandas as pd

def repeat(data:pd.DataFrame):
    for item in data.iterrows():
        yield from (item[1]['price'] for _ in range(int(item[1]['quantity'])))

data = pd.DataFrame({'price':[2.1,2.2,2.3,1.8], 'quantity':[2,1,3,1]})
data = pd.Series(repeat(data))
print(data)

免费评分

参与人数 3吾爱币 +3 热心值 +2 收起 理由
麦米尔加弗德 + 1 + 1 优美!
lizy169 + 1 + 1 谢谢@Thanks!
lbbas + 1 妙!repeat函数学习了!

查看全部评分

d8349565 发表于 2022-4-18 22:07
把两列数据提取为列表,参考tolist()
然后拼接到同一个列表,写入df中的一列,重制index

方法二
把两列分别转为两个df
使用concat拼接

pd.concat([data1,data2],axis=0)  # 合并,与merge的区别,自查(特别注意要使用[])

免费评分

参与人数 1热心值 +1 收起 理由
lizy169 + 1 谢谢@Thanks!

查看全部评分

d8349565 发表于 2022-4-18 22:09
d8349565 发表于 2022-4-18 22:07
把两列数据提取为列表,参考tolist()
然后拼接到同一个列表,写入df中的一列,重制index

补充
df也可以使用round方法设置保留多少位小数点
 楼主| lizy169 发表于 2022-4-18 22:38
d8349565 发表于 2022-4-18 22:09
补充
df也可以使用round方法设置保留多少位小数点

d1 = df['price'].tolist()
d2 = df['quantity'].tolist()
d3 = d1 + d2
print(d3)

[2.1, 2.2, 2.3, 1.8, 2, 1, 3, 1]

结果不对哦。。。
 楼主| lizy169 发表于 2022-4-18 22:42
单价2.1对应的数量是2,单价2.2对应的数量是1,单价2.3对应的数量是3,单价1.8对应的数量是1
我想得到一组这样的数据:
[2.1, 2.1, 2.2, 2.3, 2.3, 2.3, 1.8]
wuliandang 发表于 2022-4-18 23:39
本帖最后由 wuliandang 于 2022-4-18 23:46 编辑

import pandas as pd
# 源数据
source_index = [1,2,3,4]
source_data = pd.DataFrame({'price':[2.1,2.2,2.3,1.8],'quantity':[2,1,3,1]},index=source_index)
# source_data

target_data = []
# 以正常人的思维,一个一个元素添加到列表
for i in source_index:  # 遍历行
    for j in range(source_data['quantity']):  # 遍历从0~quantuty的值
        target_data.append(source_data['price'])  # 弄到列表里

print(target_data)
# print(pd.Series(target_data))

免费评分

参与人数 1热心值 +1 收起 理由
lizy169 + 1 谢谢@Thanks!

查看全部评分

 楼主| lizy169 发表于 2022-4-19 08:37
wuliandang 发表于 2022-4-18 23:39
import pandas as pd
# 源数据
source_index = [1,2,3,4]

    for j in range(source_data['quantity']):  # 遍历从0~quantuty的值
TypeError: 'Series' object cannot be interpreted as an integer

出现这样的错误
gzq830510 发表于 2022-4-19 09:13
lizy169 发表于 2022-4-19 08:37
for j in range(source_data['quantity']):  # 遍历从0~quantuty的值
TypeError: 'Series' object c ...

因为他没取索引,加个loc就可以了,也可以像下面一样,用一重循环。
[Python] 纯文本查看 复制代码
import pandas as pd
source_index = [1,2,3,4]
source_data = pd.DataFrame({'price':[2.1,2.2,2.3,1.8],'quantity':[2,1,3,1]},index=source_index)
target_data = []
""" for i in source_index:
    for j in range(source_data['quantity'].loc[i]):
        target_data.append(source_data['price'].loc[i]) """
for i in source_index:
    target_data.extend([source_data['price'].loc[i]] * source_data['quantity'].loc[i])
print(pd.Series(target_data))

免费评分

参与人数 1吾爱币 +1 收起 理由
lizy169 + 1 谢谢@Thanks!

查看全部评分

nanhai31 发表于 2022-4-19 09:17
本帖最后由 nanhai31 于 2022-4-19 09:19 编辑
wuliandang 发表于 2022-4-18 23:39
import pandas as pd
# 源数据
source_index = [1,2,3,4]


这样吧应该是
image.png

免费评分

参与人数 1吾爱币 +1 收起 理由
lizy169 + 1 谢谢@Thanks!

查看全部评分

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 14:55

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表