【问题标题】:cast data frame to long, dropping rows, expanding others将数据帧转换为长,删除行,扩展其他行
【发布时间】:2022-01-10 02:07:46
【问题描述】:

我有一个数据框可以转为更长的时间:

import pandas as pd
import io

_1 = pd.read_csv(io.StringIO(
    """date;        origin; val_one; val_two; aaa; bbb; ccc; ddd; eee; fff
    10/11/2009;        aaa;       1;       0;   0;   0;   0;   0;   1;   0
    10/11/2009;        bbb;       0;       1;   1;   0;   0;   0;   0;   1
    10/11/2009;        ccc;       0;       1;   0;   0;   0;   0;   0;   0
    10/11/2009;        ddd;       0;       2;   0;   1;   1;   1;   0;   0"""),
    sep=";").set_axis(['date', 'origin', 'val_one', 'val_two',
            'aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff'], axis=1)

我现在想创建 origin-target (rows aaa:fff) dyads。应该删除不存在目标的行(即没有一个目标列是1,例如第三行,索引 2);存在多个目标的行(例如,第二行,索引 1,其中aaa1fff 是目标列之一是1)应该变成两行。预期的输出是:

_2_targ = pd.read_csv(io.StringIO(
"""date;        origin; val_one; val_two; target
10/11/2009;        aaa;       1;       0;    eee
10/11/2009;        bbb;       0;       1;    aaa
10/11/2009;        bbb;       0;       1;    fff
10/11/2009;        ddd;       0;       2;    bbb
10/11/2009;        ddd;       0;       2;    ccc
10/11/2009;        ddd;       0;       2;    ddd"""), 
sep=';').set_axis(['date', 'origin', 'val_one', 'val_two', 'target'])

我尝试使用 pd.melt 无济于事(见下文) - 这会创建 所有 对偶,甚至是我不想保留的那些(因为没有目标列是 1) .

_2 = pd.melt(_1,
             id_vars=['date', 'origin', 'val_one', 'val_two'],
             value_vars=['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff'],
             var_name='target', value_name='tmp')

我错过了什么?

【问题讨论】:

  • output = _2[_2["tmp"].gt(0]].drop("tmp",1)

标签: python pandas melt


【解决方案1】:

我相信你可以完全按照你的方式融化,然后从你的 long_df 中删除 tmp 值为 0 的行

import pandas as pd
import io

#nice reproducible input!
df1 = pd.read_csv(io.StringIO(
    """date;        origin; val_one; val_two; aaa; bbb; ccc; ddd; eee; fff
    10/11/2009;        aaa;       1;       0;   0;   0;   0;   0;   1;   0
    10/11/2009;        bbb;       0;       1;   1;   0;   0;   0;   0;   1
    10/11/2009;        ccc;       0;       1;   0;   0;   0;   0;   0;   0
    10/11/2009;        ddd;       0;       2;   0;   1;   1;   1;   0;   0"""),
    sep=";").set_axis(['date', 'origin', 'val_one', 'val_two',
            'aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff'], axis=1)

#Melt exactly the same as you did
long_df = pd.melt(
    df1,
    id_vars=['date', 'origin', 'val_one', 'val_two'],
    value_vars=['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff'],
    var_name='target', value_name='tmp'
)

#Filter out rows where tmp is 0, sort to match your output, and drop the tmp column
long_df = long_df[long_df['tmp'].gt(0)].sort_values('origin').drop(columns='tmp').reset_index(drop=True)
long_df

输出几乎如上所示,但我认为您忘记了bbb:fff

             date       origin  val_one  val_two target
0      10/11/2009          aaa        1        0    eee
1      10/11/2009          bbb        0        1    aaa
2      10/11/2009          bbb        0        1    fff
3      10/11/2009          ddd        0        2    bbb
4      10/11/2009          ddd        0        2    ccc
5      10/11/2009          ddd        0        2    ddd

我也重命名了你的变量,但这显然不重要

【讨论】:

  • 谢谢。您对输出的看法也是正确的:您的答案给出的输出是正确的,我已经更新了问题中的错误。
猜你喜欢
  • 1970-01-01
  • 2014-08-31
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-18
  • 2018-02-08
相关资源
最近更新 更多