我需要一个给定数据帧和数字UIView()
的数据结构,该数据帧具有num
行,以便每一行都具有以下值:
-对于具有字符串值的列,我们从原始表中的列中采样值
-对于具有浮点数或整数的列,我们可以找到平均值
这是我的代码
num
由于某些原因,行包含nan值并且超过了def rows_aggr(df, num):
dataframe = None
for i in range(0, num):
row = None
for cname in df.columns.values:
column = df[cname]
dfcol = Series.to_frame(column)
if column.dtype != np.number:
item = dfcol.sample(n=1)
else:
item = dfcol.mean(axis=1)
if row is None:
row = item
else:
row = pd.concat([row, item], axis=1)
if dataframe is None:
dataframe = row
else:
dataframe = pd.concat([dataframe, row], axis=0)
return dataframe
...,并且此代码似乎无法正常工作。如果您知道实现我所需要的更好的方式,我将很高兴知道。
对于
num
我们会得到
df = pd.DataFrame({'col1':list('abcdef'),'col2':range(6)}) and num=3
假设和c, 2.5
f, 2.5
b, 2.5
是随机选择的
谢谢!
答案 0 :(得分:1)
似乎有一个错误,表明条件column.dtype != np.number
不起作用。然后,当您进行pd.concat([row, item], axis=1)
时,索引对齐会出现问题,item
包含的索引编号并不总是相同,并且会在Nan
中添加带有row
的行。这是另一种方法。
设置
df = pd.DataFrame({'col1':list('abcdef'),'col2':list('ijklmn'),
'col3':range(6),'col4':np.arange(10,16)/1.5})
print (df)
col1 col2 col3 col4
0 a i 0 6.666667
1 b j 1 7.333333
2 c k 2 8.000000
3 d l 3 8.666667
4 e m 4 9.333333
5 f n 5 10.000000
您可以使用select_dtypes
检查列是否不是数字,并使用字典理解来创建数据框,例如:
def rows_aggr(df, num):
list_col_notnumeric = df.select_dtypes(exclude=[np.number]).columns
return pd.DataFrame({col: df[col].sample(num).values
if col in list_col_notnumeric
else df[col].mean()
for col in df.columns})
print (rows_aggr(df, 3))
col1 col2 col3 col4
0 d i 2.5 8.333333
1 a n 2.5 8.333333
2 c j 2.5 8.333333