创建一个循环以根据 Python 中的布尔值对 Dataframe 进行子集化

Create a loop to subsets a Dataframe based a boolean value in Python

我在编写循环以对 Python 中的数据帧进行子集化时遇到问题。

这是我第一次 post 堆栈溢出,几个月前我开始编写代码,所以如果我做错了什么,我很抱歉..!我已经在网上看了好几天了,但找不到答案(我的关键字可能选择不当..)

为了提供一些背景信息,以下是我如何从 csv 文件中获取我的 df:

#Library

import pandas as pd
import numpy as np

#Assisgn spreadsheets filenames and read files into a Dataframe

file_20 = '/Users/cortana/Desktop/Projet stage/DAT/dat_clean/donnees_assemblees_20.csv'
df_20_initial = pd.read_csv(file_20, sep=';', usecols=[0, 2, 3])

#Create dictionary with tables names as keys

tables_names_20 = pd.DataFrame.dropna(df_20_initial.iloc[:,[0]])
tables_names_20 = tables_names_20.set_index('20').T.to_dict()

#Slice the global dataframe and store the subsets into the dictionary as values

df_20_initial['separators'] = df_20_initial['time'].isna() #add a new column that check for missing values (separators)

print(df_20_initial)

这是我的 df 的样子:

       20      time  velocity  separators
0    P1S1  6.158655  0.136731       False
1     NaN  6.179028  0.244889       False
2     NaN  6.199253  0.386443       False
3     NaN  6.219323  0.571861       False
4     NaN  6.239505  0.777680       False
..    ...       ...       ...         ...
520   NaN  7.008377  1.423408       False
521   NaN  7.028759  1.180113       False
522   NaN  7.048932  0.929300       False
523   NaN  7.068993  0.673909       False
524   NaN  7.089557  0.413527       False

[525 rows x 4 columns]

基于“分隔符”列中存在的布尔值,我想创建一个包含“时间”和“速度”列的值的新数据框,当“分隔符”值为真时切片。

为此,我尝试编写以下循环但未成功:

for lab, row in df_20_initial.iterrows() :
    if df_20_initial.iloc[:,3] == False :
        P1S1 = df_20_intermediate[['time', 'velocity']]
    else :
      break 

... 并从 Python 收到此错误消息:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

欢迎提出任何建议,提前感谢大家的宝贵时间!

Pandas 非常擅长布尔切片。如果我正确理解你的问题,我想你只需要:

new_df = df_20_initial[df_20_initial['separators']]

如果您想从输出中删除 'separators' 列,您可以只 select 剩余的列,如下所示:

new_df = df_20_initial[df_20_initial['separators']][['time', 'velocity']]

对于我的实验,我使用了你的 DataFrame separators 设置为 True 在某些行中:

     20      time  velocity  separators
0  P1S1  6.158655  0.136731       False
1   NaN  6.179028  0.244889       False
2   NaN  6.199253  0.386443       False
3   NaN  6.219323  0.571861        True
4   NaN  6.239505  0.777680       False
5   NaN  7.008377  1.423408       False
6   NaN  7.028759  1.180113       False
7   NaN  7.048932  0.929300        True
8   NaN  7.068993  0.673909       False
9   NaN  7.089557  0.413527       False

我假设 separators 列是 bool 类型。

要生成块列表,您可以使用例如以下列表 理解:

dfList = [ chunk[['time', 'velocity']] for _, chunk in
    df_20_initial.groupby(df_20_initial.separators.cumsum()) ]

现在当你打印 dfList[1] 你会得到:

       time  velocity
3  6.219323  0.571861
4  6.239505  0.777680
5  7.008377  1.423408
6  7.028759  1.180113

但是如果你想删除分隔行,运行:

dfList2 = [ chunk[~chunk.separators][['time', 'velocity']] for _, chunk in
    df_20_initial.groupby(df_20_initial.separators.cumsum()) ]

(每个块只留下带有 分隔符 == False 的行)。