使用pandas使用现有数据框中的唯一元素生成随机数据帧

时间:2018-04-16 15:14:18

标签: python pandas random logic

我正在尝试使用pandas进行一些数据操作。我有一个包含两列x,y的excel文件。 x中的元素数对应于它与列n_arrows中的元素所做的连接数(y)。列x中的唯一元素数对应于唯一点数(n_nodes)。我想要做的是使用column x中的唯一元素和column y中的元素生成一个随机数据帧(10 ^ 4次)?我试图处理的代码是附加的。任何建议将不胜感激

import pandas as pd
import numpy as np
df = pd.read_csv('/home/amit/Desktop/playing_with_pandas.csv')
num_nodes = df.drop_duplicates(subset='x', keep="last")
n_arrows = [32]             #32 rows corresponds to 32 
n_nodes = [10]
n_arrows_random = np.random.randn(df.x)

playing with data frames

1 个答案:

答案 0 :(得分:1)

以下是两种方法:

解决方案1 ​​:如果您需要xy值独立随机:

给出样本df(感谢@AmiTavory):

df = pd.DataFrame({'x': [1, 1, 1, 2], 'y': [1, 2, 3, 4]})

使用numpy.random.choice,您可以选择x列中的随机值和y列中的随机值:

def simulate_df(df, size_of_simulated_df):
    return pd.DataFrame({'x':np.random.choice(df.x, size_of_simulated_df), 
                         'y':np.random.choice(df.y, size_of_simulated_df)})

>>> simulate_df(df, 10)
   x  y
0  1  3
1  1  3
2  1  4
3  1  4
4  2  1
5  2  3
6  1  2
7  1  4
8  1  2
9  1  3

函数simulate_df返回从xy列中的原始数据框中采样的随机值。模拟数据框的大小可以由参数size_of_simulated_df控制,该参数应该是一个表示所需行数的整数。

解决方案2 :根据您的评论,根据您的任务,您可能希望返回随机行的数据框,维护x-> y对应。这是一种矢量化的pandas方法:

def simulate_df(df=df, size_of_simulated_df=10):
    return df.sample(size_of_simulated_df, replace=True).reset_index(drop=True)

>>> simulate_df()
   x  y
0  1  2
1  2  4
2  2  4
3  2  4
4  1  1
5  1  3
6  1  3
7  1  1
8  1  1
9  1  3

指定模拟的数据框以供将来参考

在您想要对模拟数据帧进行某种计算的情况下,我建议使用这样的循环将它们保存到某种字典结构中:

dict_of_dfs = {}

for i in range(100):
    dict_of_dfs['df'+str(i)] = simulate_df(df, len(df))

或者像这样的词典理解:

dict_of_dfs = {'df'+str(i): simulate_df(df, (len(df))) for i in range(100)}

然后,您可以像访问任何字典值一样访问任何一个模拟数据框:

# Access the 48th simulated dataframe:
>>> dict_of_dfs['df47']
   x  y
0  1  4
1  2  1
2  1  4
3  2  3