小编lha*_*y86的帖子

pandas groupby,其中您获得一列的最大值和另一列的最小值

我有一个数据帧如下:

user    num1    num2
a       1       1
a       2       2
a       3       3
b       4       4
b       5       5
Run Code Online (Sandbox Code Playgroud)

我想要一个数据帧,每个用户的最小值为num1,每个用户的最大值为num2.

输出应该是:

user    num1    num2
a       1       3
b       4       5
Run Code Online (Sandbox Code Playgroud)

我知道如果我想要两列的最大值,我可以这样做:

a.groupby('user')['num1', 'num2'].max()
Run Code Online (Sandbox Code Playgroud)

是否有一些等价物,而不必做以下事情:

series_1 = a.groupby('user')['num1'].min() 
series_2 = a.groupby('user')['num2'].max()

# converting from series to df so I can do a join on user
df_1 = pd.DataFrame(np.array([series_1]).transpose(), index=series_1.index, columns=['num1']) 
df_2 = pd.DataFrame(np.array([series_2]).transpose(), index=series_2.index, columns=['num2'])

df_1.join(df_2)
Run Code Online (Sandbox Code Playgroud)

python pandas pandas-groupby

7
推荐指数
1
解决办法
1万
查看次数

熊猫在多级索引数据框中选择行

我想知道为什么存在按键访问多级索引系列的行的功能,但它不存在于数据帧。

例如,我有以下数据框:

    index_1 index_2 num_1   num_2
0   a       c       1       2
1   a       c       4       3
2   a       c       3       4
3   a       d       2       3
4   b       d       3       1
5   b       d       2       3
Run Code Online (Sandbox Code Playgroud)

我现在执行 groupby 操作如下:

group_single_col = test.groupby(['index_1', 'index_2'])['num_1'].max()
Run Code Online (Sandbox Code Playgroud)

我没有问题:

group_single_col[('a')]
Run Code Online (Sandbox Code Playgroud)

或者

group_single_col[('a', 'c')]
Run Code Online (Sandbox Code Playgroud)

这是一个了不起的功能,允许我根据不同索引级别的值进行切片。

但是,如果我执行 groupby 并提取多列,如下所示:

group_double_col = test.groupby(['index_1', 'index_2'])[['num_1', 'num_2]].max()
Run Code Online (Sandbox Code Playgroud)

返回的对象是一个DataFrame,虽然实现了多级索引,但操作如下:

group_double_col[('a')] 
Run Code Online (Sandbox Code Playgroud)

失败。

我知道在第一种情况下返回一个系列,在第二种情况下返回一个数据帧,但我仍然认为该功能应该与数据帧一起正常工作。

后续问题是,在数据帧的情况下有什么解决方法?

目前我这样做:

grouped[(grouped.index.get_level_values('index_1')=='a')]
Run Code Online (Sandbox Code Playgroud)

但我质疑是否有更有效的方法。

python pandas

3
推荐指数
1
解决办法
1096
查看次数

装饰函数语法python

我正在学习python中的装饰器函数,我围绕着@语法.

这是一个装饰器函数的简单示例,它调用相关函数两次.

def duplicator(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        func(*args, **kwargs)
        func(*args, **kwargs)
    return wrapper
Run Code Online (Sandbox Code Playgroud)

如果我理解正确,它似乎:

@duplicator
def print_hi():
    print('We will do this twice')
Run Code Online (Sandbox Code Playgroud)

相当于:

print_hi = duplicator(print_hi)
print_hi()
Run Code Online (Sandbox Code Playgroud)

但是,让我们考虑一下我是否转向更复杂的例子.例如,我不想将函数调用两次,而是将其称为用户定义的次数.

使用此处的示例:https://realpython.com/primer-on-python-decorators/

def repeat(num_times):
    def decorator_repeat(func):
        @functools.wraps(func)
        def wrapper_repeat(*args, **kwargs):
            for _ in range(num_times):
                value = func(*args, **kwargs)
            return value
        return wrapper_repeat
    return decorator_repeat
Run Code Online (Sandbox Code Playgroud)

我可以通过以下方式致电:

@repeat(num_times=4)
def print_hi(num_times):
    print(f"We will do this {num_times} times")
Run Code Online (Sandbox Code Playgroud)

但是,这肯定不等同于:

print_hi = repeat(print_hi)
Run Code Online (Sandbox Code Playgroud)

因为我们有额外的论据num_times.

我有什么误会?它等同于:

print_hi = repeat(print_hi, num_times=4)
Run Code Online (Sandbox Code Playgroud)

python decorator

3
推荐指数
2
解决办法
103
查看次数

从分区表复制 Hive

我有一个按年、月和日期分区的原始表。例如:

col_1    col_2    col_3    YEAR    MONTH    DATE 
a        b        c        2017    03       25
Run Code Online (Sandbox Code Playgroud)

我想创建一个新表,它是该表的子集,但仍保留原始表的分区。

就像简单的事情

CREATE new_table AS 
SELECT * 
FROM original_table 
WHERE (conditions);
Run Code Online (Sandbox Code Playgroud)

但是,由于原始表太大,我必须通过分区迭代此查询。

我当前的解决方案是编写一个 shell 脚本,迭代所有分区并为每个分区运行单独的查询。

例子:

for year in '2016' '2017'
    do
    for month in '01' '02' ...
        do
        for day in '01' '02' ...
            do
            hive -e "INSERT INTO new_table SELECT * FROM original_table WHERE YEAR=$year AND MONTH=$month etc."
        done
    done
done
Run Code Online (Sandbox Code Playgroud)

但这显得非常迂回且低效。有没有办法直接在配置单元中将其作为一行来执行此操作?

hadoop hive partitioning hdfs

2
推荐指数
1
解决办法
1万
查看次数

标签 统计

python ×3

pandas ×2

decorator ×1

hadoop ×1

hdfs ×1

hive ×1

pandas-groupby ×1

partitioning ×1