Pandas:根据列名将值循环映射到新数据帧

时间:2017-07-02 10:48:28

标签: python pandas

我有以下df:

A  B  C
1  3  2 
2  1  10

我现在编写了一个循环遍历每一列的函数来回归C上的每一列。目的是将每列的回归的t-stat存储在映射到列名的单独数据框中。代码如下:

import pandas as pd
t_stats = pd.DataFrame(data = None, columns= df.columns)
x = df["C"]
for column in df: 
    y=df[column]
    results = fit_line(x,y) # fit line is a reg function defined somewhere else
    t_stats[column] = results[0]/results[1]

问题在于命令:

 t_stats[column] = results[0]/results[1]

我希望我计算出的结果元组中的t统计量存储在根据for循环中当前活动的列命名的列中。但是,t-stat数据帧具有来自df的列名称,但它是空的,即t统计数据根本不保存在那里。我究竟做错了什么?

所需输出t_stat数据帧:

A                              B                                   C
value of regression A on C   value of regression B on C            value of regression C on C

1 个答案:

答案 0 :(得分:2)

t_stats = pd.DataFrame(data = None, columns= df.columns)

构建一个包含三列和零行的DataFrame。

t_stats[column] = results[0]/results[1]

使用标量值column填充results[0]/results[1]列中的每一行。 由于没有行,因此没有数据添加到t_stats

相反,将数据收集到dict中,收集完所有数据后,将dict转换为DataFrame:

import pandas as pd
df = pd.DataFrame({'A':[1,2], 'B':[3,1], 'C':[2,10]})
data = dict()
x = df["C"]
for column in df: 
    y=df[column]
    # results = fit_line(x,y) # fit line is a reg function defined somewhere else
    results = [1,2]
    data[column] = results[0]/results[1]
t_stats = pd.DataFrame([data])
print(t_stats)

产量

     A    B    C
0  0.5  0.5  0.5

请注意,data有许多格式可以转换为DataFrame。 上面,我使用了一系列dicts。由于只有一行,因此列表只包含一个dict。或者,您可以传递列表的字典:

import pandas as pd
df = pd.DataFrame({'A':[1,2], 'B':[3,1], 'C':[2,10]})
data = dict()
x = df["C"]
for column in df: 
    y=df[column]
    results = [1,2]
    data[column] = [results[0]/results[1]]  # <-- dict of lists
t_stats = pd.DataFrame(data)                # note, no more brackets around data
print(t_stats)

产生相同的结果。