0

我目前正在尝试根据不同行的内容对特定行进行统计测试。给定下图中的数据框:

数据框 我想基于一个函数创建一个新列,该函数考虑到“模板”列中具有相同字符串的数据框的所有列。

例如,在这种情况下,有 2 行带有模板“[Are|Off]”,对于这些行中的每一行,我需要根据“点击次数”、“展示次数”和“转化次数”在新列中创建一个元素"的两行。

你将如何最好地解决这个问题?

PS:我提前为我描述问题的方式道歉,因为您可能已经注意到我不是专业代码:D 但我非常感谢您的帮助!

这是我在excel中解决这个问题的公式:

Excel卡方检验

4

2 回答 2

3

这可能过于笼统,但如果应该根据模板名称做不同的事情,我会使用某种函数映射:

import pandas as pd
import numpy as np
import collections

n = 5
template_column = list(['are|off', 'are|off', 'comp', 'comp', 'comp|city'])
n = len(template_column)
df = pd.DataFrame(np.random.random((n, 3)), index=range(n), columns=['Clicks', 'Impressions', 'Conversions'])
df['template'] = template_column

# Use a defaultdict so that you can define a default value if a template is
# note defined
function_map = collections.defaultdict(lambda: lambda df: np.nan)

# Now define functions to compute what the new columns should do depending on
# the template.
function_map.update({
    'are|off': lambda df: df.sum().sum(),
    'comp': lambda df: df.mean().mean(),
    'something else': lambda df: df.mean().max()
})

# The lambda functions are just placeholders.  You could do whatever you want in these functions... for example:

def do_special_stuff(df):
    """Do something that uses rows and columns... 
    you could also do looping or whatever you want as long 
    as the result is a scalar, or a sequence with the same 
    number of columns as the original template DataFrame
    """
    crazy_stuff = np.prod(np.sum(df.values,axis=1)[:,None] + 2*df.values, axis=1)
    return crazy_stuff

function_map['comp'] = do_special_stuff

def wrap(f):
    """Wrap a function so that it returns an updated dataframe"""

    def wrapped(df):
        df = df.copy()
        new_column_data = f(df.drop('template', axis=1))
        df['new_column'] = new_column_data
        return df

    return wrapped

# wrap all the functions so that each template has a function defined that does
# the correct thing
series_function_map = {k: wrap(function_map[k]) for k in df['template'].unique()}

# throw everything back together
new_df = pd.concat([series_function_map[label](group)
                    for label, group in df.groupby('template')],
                   ignore_index=True)

# print your shiny new dataframe
print(new_df)

结果是这样的:

     Clicks  Impressions  Conversions   template  new_column
0  0.959765     0.111648     0.769329    are|off    4.030594
1  0.809917     0.696348     0.683587    are|off    4.030594
2  0.265642     0.656780     0.182373       comp    0.502015
3  0.753788     0.175305     0.978205       comp    0.502015
4  0.269434     0.966951     0.478056  comp|city         NaN

希望能帮助到你!

于 2016-03-11T12:02:33.477 回答
2

好的,所以在 groupby 之后你需要应用这个公式..所以你也可以在 pandas 中这样做......

import numpy as np
t = df.groupby("Template") # this is for groupby
def calculater(b5,b6,c5,c6):
    return b5/(b5+b6)*((c5+c6))
t['result'] = np.vectorize(calculater)(df["b5"],df["b6"],df["c5"],df["c6"])

这里 b5,b6 .. 是图像中显示的单元格的列名

这应该对你有用,或者可能需要在数学上做一些小的改变

于 2016-03-11T10:59:09.970 回答