将函数应用于数据帧的每个单元格

时间:2019-05-14 14:33:27

标签: python-3.x pandas dataframe

我对如何对数据帧进行计算有些困惑。 基本上我有10个数据帧,比如说10行和10列。 我想基本上遍历每个数据框中的某个单元格,将它们附加到列表中并在其上应用函数。

示例: 从10个数据框中获取所有df(0,0)并将它们附加到列表中。最终对它们应用归一化功能,并将归一化的分数填充回各自的数据框。

下面是我要从10个不同的数据框中检索所有df(0,0)单元(例如,rangex为列表)后要进行的计算

import numpy as np

df1 = pd.DataFrame(np.random.randint(low=0, high=10, size=(5, 5)),
...                    columns=['a', 'b', 'c', 'd', 'e'])

df2 = pd.DataFrame(np.random.randint(low=0, high=10, size=(5, 5)),
...                    columns=['a', 'b', 'c', 'd', 'e'])

df3 = pd.DataFrame(np.random.randint(low=0, high=10, size=(5, 5)),
...                    columns=['a', 'b', 'c', 'd', 'e'])

df4 = pd.DataFrame(np.random.randint(low=0, high=10, size=(5, 5)),
...                    columns=['a', 'b', 'c', 'd', 'e'])


rangex = [df1.iloc[0,0], df2.iloc[0,0], df3.iloc[0,0], df4.iloc[0,0]]

OldRange = (3.0 - (-3.0))  
NewRange = (100.0 - 0.0) 
listrangex=[]
for elem in rangex:
    val = (elem - np.mean(rangex))/np.std(rangex)
    val = (((val - (-3.0)) * NewRange) / OldRange) + 0.0
    listrangex.append( val )

非常感谢!

2 个答案:

答案 0 :(得分:2)

IIUC:一次全部(排序)

设置

np.random.seed([3, 1415])

dict_of_dfs = {f'df{i}': pd.DataFrame(np.random.randn(25).reshape(5, 5)) for i in range(10)}

OldRange = np.array([-3, 3])
NewRange = np.array([0, 100])

如果您有数据帧列表,则获取字典的简单方法是

dict_of_dfs = dict(enumerate(list_of_dfs))

计算时刻

df = pd.concat(dict_of_dfs)

mu = df.mean(level=1)
sg = df.std(level=1)

定义归一化

def nrm(d):
    _d = (d - mu) / sg
    o = OldRange[1] - OldRange[0]
    n = NewRange[1] - NewRange[0]
    return (_d - OldRange[0]) * o / n + NewRange[0]

使用规范化数据更新DataFrames

for k, d in dict_of_dfs.items():
    d.loc[:] = nrm(d)

通过groupby

产生一个新的DataFrame
df.groupby(level=0).apply(lambda d: nrm(d.xs(d.name)))

没有归一化函数和矩计算

df.groupby(level=1).pipe(lambda g: df.sub(g.mean(), level=1).div(g.std(), level=1)) \
  .sub(OldRange[0]).mul(np.diff(OldRange)[0]).div(np.diff(NewRange)[0]).add(NewRange[0])

详细信息

mu

          0         1         2         3         4
0 -0.065247 -0.221818 -0.272167 -0.666434  0.353295
1  0.246533  0.049811 -0.279924 -0.025732  0.032529
2 -0.168676 -0.659385 -0.600390  0.211917 -0.007368
3  0.626222  0.072566 -0.702487 -0.338123 -0.009424
4 -0.286499  0.549944 -0.257438 -0.177977  0.254984

sg

          0         1         2         3         4
0  1.307826  1.226733  1.250311  0.931911  0.833170
1  0.758097  0.610464  0.988931  0.780028  0.696543
2  0.679647  0.962712  0.838219  0.530177  1.029039
3  0.774872  0.751137  0.570692  0.743676  0.966374
4  0.935141  0.988090  0.808165  0.937511  1.023745

# Before
dict_of_dfs['df0']

          0         1         2         3         4
0 -2.129724 -1.268466 -1.970500 -2.259055 -0.349286
1 -0.026955  0.316236  0.348782  0.715364  0.770763
2 -0.608208  0.352390 -0.352521 -0.415869 -0.911575
3 -0.142538  0.746839 -1.504157  0.611362  0.400219
4 -0.959443  1.494226 -0.346508 -1.471558  1.063243

# After
dict_of_dfs['df0']

          0         1         2         3         4
0  0.085287  0.128808  0.098500  0.077461  0.129404
1  0.158355  0.206186  0.218145  0.237005  0.243591
2  0.141198  0.243058  0.197743  0.108954  0.127279
3  0.120473  0.233860  0.095716  0.256605  0.205434
4  0.136823  0.237340  0.173387  0.097212  0.227371

答案 1 :(得分:0)

我可能要离开了,但这是你想要做的吗?

使用for循环,以i的形式从每个c中提取行df和列x中的单元格,将其操作为{{ 1}},然后附加到val

l