在Python中创建一个循环,以基于布尔值对数据帧进行子集设置



我在Python中编码一个循环以子集Dataframe时遇到问题。

这是我第一篇关于堆栈溢出的文章,我几个月前就开始编码了,所以如果我做错了什么,我很抱歉。。!我已经在网上看了好几天了,但找不到答案(我的关键词可能选得不好。(

为了提供一些上下文,以下是我如何从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]

基于存在于";分离器";列,我想创建一个包含";时间";以及";速度";列,当";分离器";值为True。

为此,我尝试对以下循环进行编码,但没有成功:

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().

欢迎提出任何建议,并提前感谢大家抽出时间!

在我的实验中,我在某些行中使用了带有分隔符设置为True的DataFrame:

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

我假设分隔符列是布尔类型。

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

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的行(。

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

new_df = df_20_initial[df_20_initial['separators']]

如果你想从输出中删除"分隔符"列,你可以选择剩下的列,如下所示:

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

最新更新