小编Jua*_*n C的帖子

如何在 Python 中导入 r 包

我对一件简单的事情感到有点困扰。我试图安装一个名为 hunspell 的包,但我发现它最初是一个 R 包。我安装了这个版本: https: //anaconda.org/conda-forge/r-hunspell,但我无法导入它。这个包应该可以与 Python 一起使用吗?我应该使用rpy2导入它吗?第一次使用跨平台包,所以我有点困惑。

需要明确的是,import hunspell带来ModuleNotFoundError: No module named 'hunspell'import r-hunspell带来SyntaxError: invalid syntax

我还注意到这个包也安装了一个r-base包,但我也不知道如何导入它。

python r

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

熊猫从宽到长带来空数据框

我正在执行一项非常简单的任务:应用于wide_to_longDataFrame,但每次运行它时,我都会得到一个空的 DataFrame。我几乎确定我的做法是正确的,所以我查阅了文档并尝试应用其中显示的示例,它还带来了一个空的 DataFrame!这是示例代码:

import pandas as pd

df = pd.DataFrame({
    'famid': [1, 1, 1, 2, 2, 2, 3, 3, 3],
    'birth': [1, 2, 3, 1, 2, 3, 1, 2, 3],
    'ht_one': [2.8, 2.9, 2.2, 2, 1.8, 1.9, 2.2, 2.3, 2.1],
    'ht_two': [3.4, 3.8, 2.9, 3.2, 2.8, 2.4, 3.3, 3.4, 2.9]
})

l = pd.wide_to_long(df, stubnames='ht', i=['famid', 'birth'], j='age', sep='_', suffix='\\w')
l.shape
Run Code Online (Sandbox Code Playgroud)

输出:

Out[2]: (0, 3)
Run Code Online (Sandbox Code Playgroud)

我尝试更新 Pandas,但没有帮助。可能会发生什么?

python dataframe pandas

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

在Python中将MySQL查询结果复制到临时文件

我对 SQL 世界有点陌生,但我正在学习名为Optimizing pandas.read_sql for Postgres 的教程。问题是,我正在处理一个大数据集,类似于教程中的示例,我需要一种更快的方法来执行查询并将其转换为 DataFrame。在那里,他们使用这个函数:

def read_sql_tmpfile(query, db_engine):
    with tempfile.TemporaryFile() as tmpfile:
        copy_sql = "COPY ({query}) TO STDOUT WITH CSV {head}".format(
           query=query, head="HEADER"
        )
        conn = db_engine.raw_connection()
        cur = conn.cursor()
        cur.copy_expert(copy_sql, tmpfile)  # I want to replicate this
        tmpfile.seek(0)
        df = pandas.read_csv(tmpfile)
        return df
Run Code Online (Sandbox Code Playgroud)

我尝试复制它,如下所示:

def read_sql_tmpfile(query, connection):
    with tempfile.TemporaryFile() as tmpfile:
        copy_sql = "COPY ({query}) TO STDOUT WITH CSV {head}".format(
           query=query, head="HEADER"
        )

        cur = connection.cursor()
        cur.copy_expert(copy_sql, tmpfile)
        tmpfile.seek(0)
        df = pandas.read_csv(tmpfile)
        return df
Run Code Online (Sandbox Code Playgroud)

问题是, …

python mysql postgresql temporary-files

5
推荐指数
1
解决办法
1484
查看次数

在熊猫中满足条件后按组向前填充缺少的值

我对此有点麻烦。我的数据框如下所示:

id    amount    dummy
1      130        0
1      120        0
1      110        1
1      nan       nan 
1      nan       nan   
2      nan        0
2      50         0
2      20         1
2      nan       nan 
2      nan       nan  
Run Code Online (Sandbox Code Playgroud)

所以,我需要做的是,在虚拟对象获取value = 1之后,我需要为每个变量的数量填充零id,如下所示:

id    amount    dummy
1      130        0
1      120        0
1      110        1
1       0        nan 
1       0        nan   
2      nan        0
2      50         0
2      20         1
2       0        nan 
2       0        nan 
Run Code Online (Sandbox Code Playgroud)

我猜我需要的某种组合groupby('id')fillna(method='ffill')也许一个.loc或一个shift() …

python group-by nan pandas

5
推荐指数
1
解决办法
64
查看次数

将区间的字符串表示形式转换为 pandas 中的实际区间

我的问题很简单,但我不确定是否有办法完成我正在寻找的事情:

我必须在 SQL 数据库中存储一些数据,其中包括一些稍后将使用的间隔。因此,我必须将其存储为字符串,如下所示:

 variable     interval
    A          (-0.001, 2.0]
    A          (2.0, 6.0]
Run Code Online (Sandbox Code Playgroud)

那么,我想使用所说的间隔来削减另一个变量,如下所示:

df1 =  pd.DataFrame({'interval': {4: '(-0.001, 2.0]',
  5: '(2.0, 6.0]'},
 'variable': {4: 'A',
  5: 'A',
}})
df2 =  pd.DataFrame({'A': [1,1,3]})
bins = df1[df1.variable.eq('A')].interval
new_series = pd.cut(df2['A'], bins=bins)
Run Code Online (Sandbox Code Playgroud)

但这带来了:

 ValueError: could not convert string to float: '(-0.001, 2.0]'
 
Run Code Online (Sandbox Code Playgroud)

尝试过:

bins = bins.astype('interval')
Run Code Online (Sandbox Code Playgroud)

但这带来了:

TypeError: type <class 'str'> with value (-0.001, 2.0] is not an interval
Run Code Online (Sandbox Code Playgroud)

有什么我可以做的吗?谢谢

python intervals pandas

5
推荐指数
1
解决办法
3241
查看次数

粘贴 URL 时,“加载更多”按钮内的 href 不会带来更多文章

我正在尝试抓取这个网站:

\n

https://noticias.caracoltv.com/colombia

\n

最后你可以找到一个“Cargar M\xc3\xa1s”按钮,它会带来更多新闻。到目前为止,一切都很好。但是,当检查该元素时,它会加载一个像这样的链接:https://noticias.caracoltv.com/colombia?00000172-8578-d277-a9f3-f77bc3df0000-page=2,如下所示:

\n

在此输入图像描述

\n

问题是,如果我将其输入浏览器,我会得到与调用原始网站相同的消息。因此,我认为能够抓取网站的唯一方法是创建一个递归单击的脚本。问题是我需要 2019 年之前的新闻,所以这似乎不太可行。

\n

另外,在检查事件侦听器时,我看到了以下内容:

\n

在此输入图像描述

\n

但我不确定如何利用它来发挥我的优势。

\n

我错过了什么吗?有什么方法可以通过链接访问较旧的新闻(或者 API 会更好,但我没有找到任何对 API 的调用)。

\n

我目前正在使用 Python 进行抓取,但我正处于调查阶段,因此没有代码表明这是有意义的。\n非常感谢!

\n

html web-scraping

5
推荐指数
1
解决办法
218
查看次数

如何在 R 中执行列的滚动合并

我有一个像这样的数据框:

stage1 stage2 stage3 stage4
a        NA     b      c
NA       d      NA     e
NA       NA     f      g
NA       NA     NA     h
Run Code Online (Sandbox Code Playgroud)

其中每一列都是流程的一个阶段。我想要做的是根据前面的列合并每一列:

stage1 stage2 stage3 stage4 
a        a      a      a
NA       d      d      d
NA       NA     f      f
NA       NA     NA     h
Run Code Online (Sandbox Code Playgroud)

实际值并不重要,这也可能是一个逻辑数据帧,其中输出的每个字符串是TRUE,每个 NA 是FALSE

我编写了这个函数,可以让我合并选择的列:

coacross <- function(...) {
  coalesce(!!!across(...))
}

df <- df %>%
  mutate(total_stages = coacross(everything()))
Run Code Online (Sandbox Code Playgroud)

这基本上创建了stage4我想要的输出列。有什么方法可以迭代运行这个,最好没有 for 循环?stage2那么我可以对和做同样的事情stage3吗?否则,还有其他方法可以做到这一点吗?

多谢。

编辑:

这有效:

for(col in names(df %>% select(-stage1))){ …
Run Code Online (Sandbox Code Playgroud)

r coalesce dplyr

5
推荐指数
2
解决办法
153
查看次数

使用来自同一行但不同列的值填充字典

最近我一直试图映射一些值,所以我试图创建一个字典来做到这一点.奇怪的是我的DataFrame有一个由列表组成的列,而DataFrames总是有点笨拙的列表.DataFrame具有以下结构:

    rules          procedure
['10','11','12']       1
['13','14']            2
['20','21','22','24']  3
Run Code Online (Sandbox Code Playgroud)

所以我想创建一个字典,将'10'映射到1,'14'映射到2,依此类推.我尝试了以下方法:

dicc=dict()
for j in df['rules']:
    for i,k in zip(j,df.procedure):
        dicc[i]=k
Run Code Online (Sandbox Code Playgroud)

但那不是成功的.可能与索引有关.我错过了什么?

编辑:我正在尝试创建一个将值'10','11','12'映射到1的字典; '13','14'到2; '20','21','22','24'到3,所以如果我打字dicc['10']我得到1,如果我输入dicc['22']我得到3.显然,实际的DataFrame非常大,我无法手动完成.

python dictionary dataframe pandas

4
推荐指数
3
解决办法
109
查看次数

在熊猫中按组获得最长连续周的连续记录

目前我正在处理不同主题的每周数据,但它可能有一些没有数据的长时间连续记录,所以,我想做的是保持每个id. 我的数据如下所示:

id    week
1      8
1      15
1      60
1      61
1      62
2      10
2      11
2      12
2      13
2      25
2      26
Run Code Online (Sandbox Code Playgroud)

我的预期输出是:

id    week
1      60
1      61
1      62
2      10
2      11
2      12
2      13
Run Code Online (Sandbox Code Playgroud)

我有点接近,试图在week==时用 1 标记week.shift()+1。问题是这种方法不会标记连续发生的第一次,而且我也无法过滤最长的一次:

df.loc[ (df['id'] == df['id'].shift())&(df['week'] == df['week'].shift()+1),'streak']=1
Run Code Online (Sandbox Code Playgroud)

根据我的例子,这将带来:

id    week  streak
1      8     nan
1      15    nan
1      60    nan
1      61    1
1      62    1
2      10    nan …
Run Code Online (Sandbox Code Playgroud)

python time-series pandas

4
推荐指数
1
解决办法
875
查看次数

使用 matplotlib 将一些文本显示为粗体

今天我正在处理一个图表,其中一部分有使用的注释plt.text。在此注释中,我想写一些类似于“本月的价格是:USD$3 ”的内容

如果不加粗,则可以翻译成如下代码:

plt.text(0.5,0.9, f"The price for this month is: USD${df.price.iloc[-1]}")
Run Code Online (Sandbox Code Playgroud)

所以,我想做的就是USD${df.price.iloc[-1]}在打印到图表时将其变为粗体。

SO 中有一个类似的问题,但对于标题,建议使用如下所示的符号:

"The price for this month is:' + r"$\bf{" + USD${df.price.iloc[-1]} + "}$"
Run Code Online (Sandbox Code Playgroud)

但该语法似乎无效,所以我不确定是否可能有一个包含粗体和非粗体部分的文本。

您知道是否可以做到,如果可以,如何做到?

python text matplotlib

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