创建一个循环以根据 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 的行)。
我在编写循环以对 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 的行)。