【问题标题】:create a tuple from columns in a pandas DataFrame从 pandas DataFrame 中的列创建一个元组
【发布时间】:2015-12-05 18:33:17
【问题描述】:

我想从 pandas 数据帧中的列自动创建一个元组(传递给 scipy.stats 函数),以便元组的每一行都是数据帧每一列的值。 这是我的数据框的标题:

                     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)

感谢您的帮助!

【问题讨论】:

  • 我在another post找到了答案:stats.f_oneway(*df.values)

标签: python pandas tuples dataframe


【解决方案1】:

怎么样

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(tup ) 而不是 stats.f_oneway(df.ix[:,0], df.ix[:,1], df.ix[:,2]) - 后者提供正确的 f 和 p 值。
  • 那是因为您需要将元组解包到位置参数中:stats.f_oneway(*tuple([tuple(df[col]) for col in df]))stats.f_oneway(*df.apply(tuple, axis=0))
  • 甚至更短的stats.f_oneway(*df.T.values)
  • 非常感谢。事实证明,我做了你的最后一条建议,我通过使用“*”解包来输入数据框,这是我以前不理解的。无需将我的数据框转换为元组!
【解决方案2】:

只需拨打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。'这可能是因为输出实际上是一个序列而不是元组。
  • 对不起,我不能根据错误编码问题,你需要显示你的代码,new_df = df.apply(tuple) for col in new_df: print(stats.f_oneway(col)) 也没有做你想做的事吗?
  • 最后,我需要解压变量并将它们传递给函数。再次感谢您的意见!
猜你喜欢
  • 2020-10-15
  • 2020-03-18
  • 2018-04-04
  • 2017-03-28
  • 2021-05-02
  • 2021-03-14
  • 1970-01-01
  • 2016-01-07
  • 1970-01-01
相关资源
最近更新 更多