用python实现平衡采样
我有一个23列8124行的df。在第一列(命名类型)中,只有两个值“e”或“p”。 现在我需要创建两个不同的df:用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%),您将无法实现它,假设
- 第一个df必须包含5686行(约70%的行),同时“e”和“p”的数量必须相同(50%的e和50%的p)
- 第二个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行的!我已经更新了我的答案,也提供了剩余的数据。