从Pandas DataFrame的列创建一个元组。

4

我希望可以自动创建一个元组(传递给scipy.stats函数),从pandas数据框中的列中提取值,使得元组的每一行是数据框中每个列的值。以下是我的数据框的标题:

                     4_3-a-0    5_3-a-4    7_3-a-3
datetime_pac                                      
2015-09-03 22:00:00   -100.4 -96.857143 -55.000000
2015-09-03 22:01:00   -100.5 -91.700000 -55.600000
2015-09-03 22:02:00   -100.4 -90.875000 -55.900000
2015-09-03 22:03:00   -100.4 -94.000000 -55.555556
2015-09-03 22:04:00   -100.5 -99.500000 -55.545455

我可以手动完成这个操作,如下所示:

from scipy import stats
stats.f_oneway(df.ix[:,0], df.ix[:,1], df.ix[:,2])

但是我希望在数据框中列数未知的情况下“自动化”这个过程。以下尝试(以及许多变体)都无法实现:

stats.f_oneway(tuple(x) for x in xtmp.values)
stats.f_oneway((xtmp[x]) for x in xtmp.columns)

感谢您的帮助!

我在另一篇帖子中找到了答案:stats.f_oneway(*df.values)。 - Nicole Goebel
2个回答

9

只需调用apply并调用tuple

In [3]:
df = pd.DataFrame(np.random.randn(5,3))
df

Out[3]:
          0         1         2
0  0.785562 -0.263813  2.239865
1  1.083918  0.035746  0.429111
2  1.422599 -0.818151  0.765725
3  1.022289  0.098561 -2.393095
4 -0.548451 -0.345796  0.298237

In [4]:
df.apply(tuple, axis=1)

Out[4]:
0     (0.785562108573, -0.263813112223, 2.23986497964)
1     (1.08391788685, 0.0357457180803, 0.429110675053)
2      (1.4225989372, -0.818150896781, 0.765724984713)
3     (1.02228880387, 0.0985610274998, -2.39309469576)
4    (-0.548450748411, -0.345796089243, 0.298237353...
dtype: object

感谢新的方法。虽然这确实将列放入元组中(使用axis=0),但stats.f_oneway()会抛出错误:“ValueError: setting an array element with a sequence.” 这可能是因为输出实际上是一个系列而不是元组。 - Nicole Goebel
抱歉,我无法根据错误编写代码解决问题,您需要展示您的代码。此外,new_df = df.apply(tuple) for col in new_df: print(stats.f_oneway(col)) 是否符合您的要求? - EdChum
最终,我需要解包变量并将它们传递给函数。再次感谢您的建议! - Nicole Goebel

0

关于什么?

tuple([tuple(df[col]) for col in df])

感谢您的建议。它确实可以创建正确格式的元组,但是当将其馈送到stats.f_oneway()时,它返回与元组每行相同长度的f和p值。如果我将元组(tup = df.ix [:,0],df.ix [:,1],df.ix [:,2])传递给函数而不是stats.f_oneway(df.ix [:,0],df.ix [:,1],df.ix [:,2]),则会出现这种情况-后者提供正确的f和p值。 - Nicole Goebel
这是因为你需要将元组解包成位置参数:stats.f_oneway(*tuple([tuple(df[col]) for col in df])) 或者 stats.f_oneway(*df.apply(tuple, axis=0)) - hellpanderr
甚至可以更简短:stats.f_oneway(*df.T.values) - hellpanderr
非常感谢您的建议。事实证明,我采用了您的最后一个建议,即通过使用“*”解包来输入数据框,这是我之前不理解的内容。无需将我的数据框转换为元组! - Nicole Goebel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接