我在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']]