如何确定下n行或更多行是否小于或等于数据帧列的给定值?(pandas,python)
问题数据集:如何确定下n行或更多行是否小于或等于数据帧列的给定值?(pandas,python),python,pandas,csv,dataframe,transformation,Python,Pandas,Csv,Dataframe,Transformation,问题数据集: datasetA = pd.DataFrame(data={'A':[1,100,80,10,8,8,9,11], 'B':[1,100,90,12,7,8,9,10], 'C':[1,100,80,13,12,11,12,13], 'D':[1,100,90,9,8,7,10,10]}
datasetA = pd.DataFrame(data={'A':[1,100,80,10,8,8,9,11],
'B':[1,100,90,12,7,8,9,10],
'C':[1,100,80,13,12,11,12,13],
'D':[1,100,90,9,8,7,10,10]}
'E':[1,100,90,19,18,17,9,10]})
A B C D E
0 1 1 1 1 1
1 100 100 100 100 100
2 80 90 80 90 80
3 10 12 13 9 19
4 8 7 12 8 18
5 8 8 11 7 17
6 9 9 12 10 9
7 11 10 13 10 10
我们需要对照的数值是10如果在一列中,我们连续四行或更多行的值小于或等于10,我们使用pandas DataFrame
rolling
方法和自定义函数获取第一个下降到=的数字:
import pandas as pd
df = pd.DataFrame(data={'A':[1,100,80,10,8,8,9,11],
'B':[1,100,90,12,7,8,9,10],
'C':[1,100,80,13,12,11,12,13],
'D':[1,100,90,9,8,7,10,10]})
dfr = df.rolling(window=4).agg(lambda w: (w<=10).all())
dfr.dropna(inplace=True)
lst=[]
for c in list(df):
try:
#Retrieve first index we have a four consecutive numbers less than 10
first_id = dfr.index[dfr[c] == 1].values.tolist()[0]
# Consider the product of all 0s or 1s we have after
v = dfr.loc[first_id:][c].prod()
#Append column, first index if all ones
if v == 1:
lst.append((c, df.loc[first_id-3][c]))
# Otherwise append columns, 0
else:
lst.append((c, 0))
except:
lst.append((c,0))
lst
[('A', 0), ('B', 7), ('C', 0), ('D', 9)]
将熊猫作为pd导入
df=pd.DataFrame(数据={'A':[1100,80,10,8,8,9,11],
“B”:[1100,90,12,7,8,9,10],
‘C’:[1100,80,13,12,11,12,13],
‘D’:[1100,90,9,8,7,10,10]})
dfr=df.rolling(window=4).agg(lambda w:(w使用带有自定义函数的pandas数据帧rolling
方法:
import pandas as pd
df = pd.DataFrame(data={'A':[1,100,80,10,8,8,9,11],
'B':[1,100,90,12,7,8,9,10],
'C':[1,100,80,13,12,11,12,13],
'D':[1,100,90,9,8,7,10,10]})
dfr = df.rolling(window=4).agg(lambda w: (w<=10).all())
dfr.dropna(inplace=True)
lst=[]
for c in list(df):
try:
#Retrieve first index we have a four consecutive numbers less than 10
first_id = dfr.index[dfr[c] == 1].values.tolist()[0]
# Consider the product of all 0s or 1s we have after
v = dfr.loc[first_id:][c].prod()
#Append column, first index if all ones
if v == 1:
lst.append((c, df.loc[first_id-3][c]))
# Otherwise append columns, 0
else:
lst.append((c, 0))
except:
lst.append((c,0))
lst
[('A', 0), ('B', 7), ('C', 0), ('D', 9)]
将熊猫作为pd导入
df=pd.DataFrame(数据={'A':[1100,80,10,8,8,9,11],
“B”:[1100,90,12,7,8,9,10],
‘C’:[1100,80,13,12,11,12,13],
‘D’:[1100,90,9,8,7,10,10]})
dfr=df.rolling(window=4).agg(lambda w:(wdef set\u column\u value(column)):
要设置的值=0
连续小于等于10的计数器=0
对于索引,枚举中的val(列):
如果列[索引]def设置列值(列):
要设置的值=0
连续小于等于10的计数器=0
对于索引,枚举中的val(列):
如果列[index]你的问题到底是什么?你能再详细一点吗?当然,我试图得到第一个值,它下降到10或以下并保持=第一列应该返回10..否?否,因为最后它变为11(10以上)你的问题到底是什么?你能再详细一点吗?当然,我试图得到第一个值,这个值下降到10或以下,并保持=第一列应该返回10..不?不,因为最后大约700万列的值变为11(10以上),这不会永远吗?你的用例要求你检查连续的值(因此您无法对其进行排序),并且您还没有共享任何其他适用于数据帧的属性,因此您似乎需要检查每个值;您始终可以按列将数据帧拆分为更小的数据帧,因为您的列之间没有相互依赖关系。在共享答案之前,您已经对其进行了测试-也许您希望得到结果(1x n_列)size当此代码返回(n_行x n_列)size时,如果是这样,只需使用df.head(1),因为如果连续的小于小于等于等于等于等于等于等于等于等于等于等于4的计数器==4:(行尾)值等于列[index-3](行尾)如果列[index]>10:(行尾)值等于0(行尾)列=[value_to_be_set for i in column](行尾)返回约700万列的列(行尾),这不会持续很久吗?您的用例要求您检查连续值(因此无法对其排序),并且您没有共享任何其他适用于数据帧的属性,因此看起来您需要检查每个值;您始终可以按列将数据帧拆分为更小的数据帧,因为您的列之间没有相互依赖关系。在共享答案之前,我已经测试了它-可能您希望得到(1x n_列)的结果大小当此代码返回(n_rows x n_columns)size时,如果是这样的话,只需使用df.head(1),因为如果连续的小于小于等于等于等于等于等于等于等于等于等于等于4:(行尾)值等于等于等于列[index-3](行尾)如果列[index]>10:(行尾)值等于0(行尾)列=[value_to_be_set for i in column](行尾)返回列(行尾)您只需要在该模块检索的索引之后找到前10个是的,但不应该说('D',6)D应该是9I虽然您正在查找第一次出现的索引,但编辑了答案以返回值我再次尝试了它仍然不起作用,请您再检查一次。现在重试,我得到的结果与您在上面写的结果相同。您只需在本模块检索索引后查找前10个是的,但它不应显示('D',6)D应该是9I虽然您正在查找第一次出现的索引,但编辑了答案以返回值我再次尝试了它仍然不起作用,请您再检查一次,现在重试,我得到的结果与您上面所写的相同
def set_column_value(column):
value_to_be_set = 0
consecutive_less_than_10_counter = 0
for index, val in enumerate(column):
if column[index] <= 10:
consecutive_less_than_10_counter += 1
else:
consecutive_less_than_10_counter = 0
if consecutive_less_than_10_counter == 4:
value_to_be_set = val
break
column = [value_to_be_set for i in column]
return column
df = df.apply(lambda column: set_column_value(column))
# this will use axis=0 i.e iterate through each column!