Pandas 打印数据框列中条件成立的日期周期?

如何解决Pandas 打印数据框列中条件成立的日期周期?

我有一个txt。文件如下:

Name 1
                                                           
                                                           
   @Name( )                  Value       WATER       WHP     
                  Date       Unit         Unit       Unit     
-------------- ---------- ---------- ---------- ---------- 
Name 1       20081220      2900.00       0.00    3300.00 
Name 1       20081221      0.00          0.00    3390.00 
Name 1       20081222      2500.00       0.00    2802.00 
Name 1       20081223      0.00          0.00    3022.00
Name 1       20081224      0.00          0.00    3022.00

我使用以下代码导入python:

df = pd.read_csv(r'test_prd.txt',skiprows=6,engine="python",header=None)
df.columns = ['Test']
df.drop(df.tail(1).index,inplace = True) # because of file format
df = df.Test.str.split(expand=True)

df.rename(columns ={0:'Name',1:'Number',2:'Date',3:'Value',4:'Water',5:'WHP'},inplace=True)
df['Date'] = pd.to_datetime(df['Date']).dt.floor('D').dt.strftime('%Y-%m-%d')
df['Note'] = (df['Value']).apply(lambda x: 'yes' if x==0 else '')
del df['Water']
del df['WHP']
    
df['Name'] = df['Name'].astype(str) + ' ' + df['Number'].astype(str)
del df['Number']

使用此代码后,数据框如下所示:

           Name      Date       Value       Note
    0     Name 1  2008-12-20    2900.00      
    1     Name 1  2008-12-21    0.00         Yes
    2     Name 1  2008-12-22    2500.00      
    3     Name 1  2008-12-23    0.00         Yes
    4     Name 1  2008-12-24    0.00         Yes 
   ...    ...        ...        ...          ...
    78    Name    2009-03-15    0.00         Yes
    79    Name    2009-03-16    3000.00      
    80    Name    2009-03-17    0.00         Yes
   ...    ...        ...        ...          ...

我想打印“值”列为零的时间段(开始日期 - 结束日期),即当“注意”=是时。任何其他值为非零的行都可以从数据框中删除。如果独立值为零(前后为非零值),则开始日期和结束日期将相同。

预期的输出应该是这样的:

      Name     Start Date      End Date     Value       Note
1     Name     2008-12-21    2008-12-21     0.00         Yes
2     Name     2008-12-23    2009-03-15     0.00         Yes
3     Name     2009-03-17        ***        0.00         Yes
       ...        ...           ...         ...          ...

我试图使用条件 if 语句或 df.loc,但我对 Python 的了解不足以将它们组合在一起。任何建议将不胜感激。

解决方法

首先让我们使用 read_csv

导入您的数据框
df = PD.read_csv("yourfile.txt",sep="\s+",engine="python",parse_dates=["Date"])
df["Value"] = df["Value"].astype(float)

请务必使用正确的列分隔符替换 sep 的值。这里我假设分隔符是一个或多个空格,如果不是请修改它。
还要确保使用 "Date" 参数将 parse_dates 列转换为日期时间,并且 "Value" 列的类型为 float。

现在将 df 作为您的数据框,此代码段应该可以满足您的需求。

df["Start"] = (df["Value"] == 0) & (df["Value"].shift(1) != 0)
ddf = df[df["Value"] == 0]
ddf["Group"] = ddf["Start"].cumsum()
rdf = ddf.groupby("Group").apply(lambda x: PD.Series({"Name":x["Name"].iloc[0],"Start Date":x["Date"].min(),"End Date":x["Date"].max(),"Value": 0.,"Note": "Yes",})).reset_index(drop=True)

这里的重点是使用一些pandas函数以有效的方式实现您想要的。不要使用循环,如果您的数据框很大,您将需要大量时间来执行代码。

  1. 在这里,我首先创建一个 "Start" 列,我在其中检查哪一行是零间隔系列行的开始。我通过将 "Value" 行向前移动 1 个位置并比较每一行来做到这一点。 "Start" 列对于应该开始间隔的每一行都有一个 True 值。
  2. 然后我删除非零 "Value" 行。
  3. 然后我使用 cumsum 对“开始”列求和。这将创建一个新列,我可以使用它来将应该连接的间隔组合在一起。
  4. 最终我可以使用 groupbyapply 将组连接在一起,并为每个组创建一个新数据框的单行,我可以从 {{1 }} 列。

根据您发布的行,最终结果是:

"Date"
,

要选择“注释”列是“是”的框架的所有行,请使用:

df.loc[df['Note'] == 'Yes']

这会生成一个包含仅满足上述条件的行的框架。

更多有用的操作参见: How to select rows from a DataFrame based on column values

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?