我尝试id3根据两个变量(id1,id2)找到"group"():
df = data.frame(id1 = c(1,1,2,2,3,3,4,4,5,5),
id2 = c('a','b','a','c','c','d','x','y','y','z'),
id3 = c(rep('group1',6), rep('group2',4)))
id1 id2 id3
1 1 a group1
2 1 b group1
3 2 a group1
4 2 c group1
5 3 c group1
6 3 d group1
7 4 x group2
8 4 y group2
9 5 y group2
10 5 z group2
Run Code Online (Sandbox Code Playgroud)
例如 id1=1关系到a和b的id2.但id1=2也与之相关,a因此两者都属于一个群体(id3=group1).但既然id1=2和id1=3 …
我想用来query()过滤 panda 数据框中出现在给定列表中的行。与这个问题类似,但我真的更喜欢使用query()
import pandas as pd
df = pd.DataFrame({'A' : [5,6,3,4], 'B' : [1,2,3, 5]})
mylist =[5,3]
Run Code Online (Sandbox Code Playgroud)
我试过:
df.query('A.isin(mylist)')
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个类似于下面摘自本文的图,本质上是一个具有两个不同 y 轴的 3d 图。按照本博客中的指导,我创建了一个最小的示例。
模块
from mpl_toolkits import mplot3d
import numpy as np
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
Run Code Online (Sandbox Code Playgroud)
创建一些数据
def f(x, y):
return np.sin(np.sqrt(x ** 2 + y ** 2))
x = np.linspace(-6, 6, 30)
y = np.linspace(-6, 6, 30)
X, Y = np.meshgrid(x, y)
Z = f(X, Y)
Z2 = Z*100+100
Run Code Online (Sandbox Code Playgroud)
绘图
这会创建一个漂亮的 3D 绘图,但显然只有一个 y 轴。我在网上找不到任何关于如何使用 python 的建议,尽管有一些关于 matlab 的建议。
fig = plt.figure()
ax = plt.axes(projection='3d')
ax.plot_surface(X, Y, …Run Code Online (Sandbox Code Playgroud) 意识到使用动态变量名称的危险,我试图循环使用varios回归模型,其中选择了不同的变量规范.通常!!rlang::sym()我很好地解决了这种问题,但它在回归中失败了.一个最小的例子如下:
y= runif(1000)
x1 = runif(1000)
x2 = runif(1000)
df2= data.frame(y,x1,x2)
summary(lm(y ~ x1+x2, data=df2)) ## works
var = "x1"
summary(lm(y ~ !!rlang::sym(var)) +x2, data=df2) # gives an error
Run Code Online (Sandbox Code Playgroud)
我的理解是!!rlang::sym(var))获取var(即x1)的值并将其放入代码中,R认为这是一个变量(不是char).我似乎错了.任何人都可以开导我吗?
考虑以下数据集:
df = data.frame(id = c(1,1,1,2,2,2,3,3,3),
time = c(1,2,3,1,2,3,1,2,3),
x = c(8,8,9,7,7,7,7,7,8),
id_x = c(1,1,2,3,3,3,4,4,5))
Run Code Online (Sandbox Code Playgroud)
我想在R中(最好使用dplyr)计算变量id_x,该变量标识变量id和的每个唯一组合x。
在Stata中,我可以执行以下操作:
clear
input id time x
1 1 8
1 2 8
1 3 9
2 1 7
2 2 7
2 3 7
3 1 7
3 2 7
3 3 8
end
egen id_x = group(id, x)
list, separator(0)
+----------------------+
| id time x id_x |
|----------------------|
1. | 1 1 8 …Run Code Online (Sandbox Code Playgroud) 在 RI 中可以使用以下方法将多个对象保存到硬盘驱动器:
a = 3; b = "c", c = 2
save(a, b, filename = "filename.R")
Run Code Online (Sandbox Code Playgroud)
然后我可以使用load("filename.R")将所有对象恢复到工作区中。Python有等价物吗?
我知道我可以使用
import pickle
a = 3; b = "c", c = 2
with open("filename.pkl", 'wb') as f:
pickle.dump([a,b], f)
Run Code Online (Sandbox Code Playgroud)
并将其加载回:
with open("filename.pkl", 'rb') as f:
a,b = pickle.load(f)
Run Code Online (Sandbox Code Playgroud)
但这需要我知道里面filename.pkl是什么才能完成任务a,b = pickle.load(f)。有没有另一种方法更接近我在 R 中所做的?如果没有,是否有我目前看不到的原因?
- 编辑:我不同意链接的问题讨论相同的问题。我不是要求所有变量,只要求特定变量。很可能没有办法转储所有变量(可能是因为全局环境中的某些变量无法导出或诸如此类……)但仍然可以导出一些。
在 RI 中经常使用dplyr'sselect与everything()
df %>% select(var4, var17, everything())
Run Code Online (Sandbox Code Playgroud)
例如,上面的示例将重新排序数据帧的列,例如var4第一列,var17第二列,随后列出所有剩余的列。这样做的最熊猫方式是什么?处理许多列使得明确地将它们拼写出来并跟踪它们的位置是一件痛苦的事情。
理想的解决方案是简短、可读且可用于 Pandas 链接。
我可以在一行中轻松地将列表指定为 pandas 中的列名称,但是(如何)我可以在方法链中做同样的事情吗?
import pandas as pd
df = pd.DataFrame(data={'a':[1,2], 'b':[2,4]})
new_column_names =['aa', 'bb']
# classical way:
df.columns= new_column_names
Run Code Online (Sandbox Code Playgroud)
我想要的是有一个更长的方法链:
# method chain
(df.some_chain_method(...)
.another_chain_method(...)
.assign_columnnames(new_columns_names))
Run Code Online (Sandbox Code Playgroud)
您可以假设您知道列数并且它匹配new_column_names
假设您有:
df = data.frame(a = c(1,2,NA),b = c(NA, 1,2))
> df
a b
1 1 NA
2 2 1
3 NA 2
Run Code Online (Sandbox Code Playgroud)
并希望基于a创建一个新列c。如果缺少a,则使用b。这有效:
df %>% mutate(c= a,
c = replace(c, is.na(a), b[is.na(a)]))
Run Code Online (Sandbox Code Playgroud)
但是(对我来说,只有我吗?)看起来笨拙(就我而言,我必须拼出is.na(a)两次)。这比较容易:
df %>%
rowwise() %>%
mutate(c = a,
c = replace(c, is.na(a), b]))
Run Code Online (Sandbox Code Playgroud)
但是它需要额外的rowwise()命令,我可以想象到情景陈述中我的陈述之和mutate将无法按行工作。
我是否缺少一些dplyr使此操作(非常常见的任务)更容易的功能?
我想创建变量的滞后。在面板数据设置中,显然仅在每个面板内考虑滞后。
为什么它plm不lag()尊重面板结构(默认情况下)并且有没有办法改变它(无需手动 dplyr )?
# Load example data
data("EmplUK", package = "plm")
Em <- pdata.frame(EmplUK, index=c('firm', 'year'))
# how I think it should have worked
Em$lwage_incorrect = lag(Em$wage)
# what actually works
Em= Em %>% group_by(firm) %>% mutate(lwage_correct = lag(wage))
Run Code Online (Sandbox Code Playgroud) 我想将包含列表的列扩展/转换为多列:
df = pd.DataFrame({'a':[1,2], 'b':[[11,22],[33,44]]})
# I want:
pd.DataFrame({'a':[1,2], 'b1':[11,33], 'b2':[22,44]})
Run Code Online (Sandbox Code Playgroud) 这应该是非常明显的,但我在网上找不到答案:
df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]})
df2 = df
del df
Run Code Online (Sandbox Code Playgroud)
如何重新命名df,以df2不创建副本,并删除原来的?