我有一个数据帧如下:
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) 我想知道为什么存在按键访问多级索引系列的行的功能,但它不存在于数据帧。
例如,我有以下数据框:
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中的装饰器函数,我围绕着@语法.
这是一个装饰器函数的简单示例,它调用相关函数两次.
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) 我有一个按年、月和日期分区的原始表。例如:
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)
但这显得非常迂回且低效。有没有办法直接在配置单元中将其作为一行来执行此操作?