鱼C论坛

 找回密码
 立即注册
查看: 1250|回复: 8

用python贴标签

[复制链接]
发表于 2020-6-6 21:08:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
嗨,鱼油们!我又来问问题了,跟上次那个问题一样,我简单的说一下这个问题。图中的原数据只有第一列,现在我想用python的pandas模块导入第一列数据(这个步骤我会),然后用一个for循环和if语句实现图中后两列的结果,并且将结果输出为像图中所示的新表。我用pandas导入数据后会形成dataframe格式,我不会将这个格式转化为整型,所以就无法用if循环。我是这样想的代码,,,乱七八糟,,,新人一个,求大佬们解答
任务.png
1591448885(1).png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-6 21:32:20 | 显示全部楼层
?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-6 22:20:18 | 显示全部楼层
你说清楚一点,为什么-1的标签是-100,步长是5
1的标签是100,步长是0
为什么其他数字的标签和步长都是0,你不要告诉你的代码,你要把你的诉求说清楚,要达到什么效果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-8 10:53:33 | 显示全部楼层
BIO-张磊 发表于 2020-6-6 22:20
你说清楚一点,为什么-1的标签是-100,步长是5
1的标签是100,步长是0
为什么其他数字的标签和步长都是0 ...

好滴好滴,我的原始数据只有E520这一列,现在我需要在这些数据后面贴标签(标签有0,100,-100),贴标签规则如下:看E520这一列数字的正负变化,如果数字由正数变成负数(第6、7行数字由9变到-1),那就在负数-1后面标记-100;如果数字由负数变成正数(如第10、11行数字由-3变成1),那就在正数1后面标记100;其他由正数变正数,负数变负数都标记数字0。步长的计算是看标签-100和100之间的行数,拿图中的例子来说就是第7行到第11行总共有5行,步长就是5.其他的步长都是0.将得到的结果输出到“标签”和“步长”这两列。我这次应该是说明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-8 11:56:26 | 显示全部楼层
import pandas as pd


data = pd.DataFrame({"E520":[9,4,1,5,9,-1,-3,-5,-3,1,4,5,6]})
data["label"] = 0#标签列
data["step"] = 0#步值列
#print(data)

E520_len = len(data["E520"])


#先解决index列
for i in range(E520_len):
    step = 0
    for j in range(i + 1,E520_len):
        if data.iloc[i,0]*data.iloc[j,0] > 0:#同时为正或负
            pass
        else:
            if data.iloc[j,0] > 0:
                data.iloc[j,1] = 100
            else:
                data.iloc[j,1] = -100
               
            i = j   
            break
            
#print(data)

#再解决step列
data_label_not0_index = data[data["label"] != 0].index.to_list()
#print(data_label_not0_index)
data_label_not0_index_length = len(data_label_not0_index)
data_label_not0_step = [data_label_not0_index[i+1] - data_label_not0_index[i] + 1 for i in range(data_label_not0_index_length - 1)]
#print(data_label_not0_step)
count = 0
for i in data_label_not0_index[:-1]:
    data.iloc[i,2] = data_label_not0_step[count]
    count += 1

print(data)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-8 11:57:38 | 显示全部楼层
我建议 还是要去多学习基础的,你现在可能连for循环的嵌套的一些用法都没用好,很多东西都是很难坐的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-8 15:00:24 | 显示全部楼层
BIO-张磊 发表于 2020-6-8 11:57
我建议 还是要去多学习基础的,你现在可能连for循环的嵌套的一些用法都没用好,很多东西都是很难坐的

嗯嗯好滴,刚开始学,有点懵,谢谢大佬的指教,我好好学学基础~十分感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-8 17:50:30 | 显示全部楼层
本帖最后由 snaker 于 2020-6-8 17:56 编辑

给你个VBA版本的
Sub test()
a = 2
b = 0
Sheet1.Cells(a, 2).Value = 0
Sheet1.Cells(a, 3).Value = 0
While Sheet1.Cells(a, 1) <> 0
    If Sheet1.Cells(a, 1).Value * Sheet1.Cells(a + 1, 1).Value > 0 Then
        Sheet1.Cells(a + 1, 2).Value = 0
        Sheet1.Cells(a + 1, 3).Value = 0
    Else
        If Sheet1.Cells(a + 1, 1) Then        
            If Sheet1.Cells(a, 1).Value > Sheet1.Cells(a + 1, 1).Value Then
                Sheet1.Cells(a + 1, 2).Value = -100
            Else
                Sheet1.Cells(a + 1, 2).Value = 100
            End If        
            If b = 0 Then
                b = a
            Else
                Sheet1.Cells(b + 1, 3).Value = a - b + 1
                b = a
            End If
        End If
    End If
    a = a + 1
Wend
Sheet1.Cells(b + 1, 3).Value = 0
End Sub
可以点击按钮,或者在VBA中运行
QQ录屏20200608174510[00_00_09--00_00_29].gif
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-9 06:43:45 From FishC Mobile | 显示全部楼层
嗯嗯嗯!第一次见这种形式,我好好学一下,谢谢你~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-20 19:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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