Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用python实现平衡采样_Python_Dataframe_Sampling - Fatal编程技术网

用python实现平衡采样

用python实现平衡采样,python,dataframe,sampling,Python,Dataframe,Sampling,我有一个23列8124行的df。在第一列(命名类型)中,只有两个值“e”或“p”。 现在我需要创建两个不同的df: 第一个df必须包含5686行(约70%的行),同时“e”和“p”的数量必须相同(50%的e和50%的p) 第二个df必须包含剩余的行 重要信息:所有这些行必须由原始df随机选择(不允许重复) 编辑:没有足够的行包含元素e和p,因此我不得不牺牲一些距离,这取决于“e”和“p”在完整数据集中的比例。如果“e”或“p”中的任何一个小于2843(5686的50%),您将无法实现它,假设

我有一个23列8124行的df。在第一列(命名类型)中,只有两个值“e”或“p”。 现在我需要创建两个不同的df:

  • 第一个df必须包含5686行(约70%的行),同时“e”和“p”的数量必须相同(50%的e和50%的p)
  • 第二个df必须包含剩余的行
重要信息:所有这些行必须由原始df随机选择(不允许重复)


编辑:没有足够的行包含元素e和p,因此我不得不牺牲一些距离,这取决于“e”和“p”在完整数据集中的比例。如果“e”或“p”中的任何一个小于2843(5686的50%),您将无法实现它,假设您满足此条件,您可以尝试以下方法:

filtered_data = df.groupby(['Col_with_e_and_p']).apply(lambda x: x.sample(n=2843)).reset_index(drop = True)
对于剩余数据,您可以使用此解决方法,因为分组后原始索引将消失:

bool_position = df.merge(filtered_data, how='left', indicator=True)['_merge'].str.contains('left_only')
remaining_df = df[bool_position]

这取决于完整数据集中“e”和“p”的比例。如果“e”或“p”中的任何一个小于2843(5686的50%),您将无法实现它,假设您满足此条件,您可以尝试以下方法:

filtered_data = df.groupby(['Col_with_e_and_p']).apply(lambda x: x.sample(n=2843)).reset_index(drop = True)
对于剩余数据,您可以使用此解决方法,因为分组后原始索引将消失:

bool_position = df.merge(filtered_data, how='left', indicator=True)['_merge'].str.contains('left_only')
remaining_df = df[bool_position]

如果数据帧是这样的:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.uniform(0,1,(8124,23)))
df.insert(0,"x",np.random.choice(['e','p'],8124))
如果你事先知道这些数字,那么一种方法是使用列表理解来获得“e”的1/2和“p”的1/2的索引。然后使用以下方法对数据帧进行子集:

n = (np.floor(0.7*df.shape[0])/2).astype('int')
2843

idx = np.array([np.random.choice(df.index[df['x']==i],n,replace=False)  for i in ['p','e']]).flatten()

df1 = df.iloc[idx]
df2 = df.iloc[~df.index.isin(idx)]

如果数据帧是这样的:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.uniform(0,1,(8124,23)))
df.insert(0,"x",np.random.choice(['e','p'],8124))
如果你事先知道这些数字,那么一种方法是使用列表理解来获得“e”的1/2和“p”的1/2的索引。然后使用以下方法对数据帧进行子集:

n = (np.floor(0.7*df.shape[0])/2).astype('int')
2843

idx = np.array([np.random.choice(df.index[df['x']==i],n,replace=False)  for i in ['p','e']]).flatten()

df1 = df.iloc[idx]
df2 = df.iloc[~df.index.isin(idx)]

完整数据框中的“e”和“p”行的频率是否也为50%?完整数据框中的“e”和“p”行的频率是否也为50%?应该可以工作,但我的问题不是用70%的随机行和相同数量的e和p行创建第一个df。但是要创建第二个包含Remining行的!我已经更新了我的答案,并给出了剩余的数据。它应该可以工作,但我的问题不是创建第一个具有70%随机行和相同数量的e和p行的df。但是要创建第二个包含Remining行的!我已经更新了我的答案,也提供了剩余的数据。