当前位置: 首页 > 知识库问答 >
问题:

从部分字符串匹配创建新的数据帧[duplicate]

桂高昂
2023-03-14

我有一个相对简单的数据框,看起来像这样(见下文)。其中一列“书”是一个字符串列表。

我的目标是为“Book”中三个不同的值中的每一个创建新的数据帧。也就是说,一个包含国际上出现的每个产品、国内出现的每个产品以及订阅的数据框架。

我不知道如何创建一个新的数据帧,它是由匹配现有数据帧中的部分字符串构建的。是否有一个内置的功能,或者我应该构建一个循环,在数据帧上迭代,并据此构建一个新的循环?

df

    Description      Book                               Product ID
0   Products      International, Domestic                 X11
1   Products      International                           X12
2   Products      Domestic                                X13
3   Products      Domestic, International                 X21
4   Services      Subscription, Domestic                  X23
5   Services      International, Domestic                 X23
6   Services      Subscription, International, Domestic   X25

我曾尝试使用不同组合的熊猫是在功能,但这需要你知道确切的字符串,你正在寻找。在我的例子中,Book列可以有三个值的任何顺序,因此我无法成功地使用isin。

我尝试的一个循环示例是:

f = []
for index,row in df.iterrows():
    if "International" in row['Book']:
        f.append 

然而,这会创建一个空列表,我知道这是不对的。我不太擅长在数据帧上构建循环,任何建议都非常感谢。

我的目标输出是如下所示的数据帧:

df

    Description      Book                               Product ID
0   Products      International                           X11
1   Products      International                           X12
2   Products      International                           X21
3   Services      International                           X23
4   Services      International                           X25

df

    Description   Book                               Product ID
0   Products      Domestic                                X11
2   Products      Domestic                                X13
3   Products      Domestic                                X21
4   Services      Domestic                                X23
5   Services      Domestic                                X25

订阅也一样。我已经研究了多个其他SO问题,但找不到一个在这种情况下有帮助的问题。

共有3个答案

贡正诚
2023-03-14

我用get\u dummies

s=df.Book.str.get_dummies(sep=',')
[df[s[x]==1].assign(Book=x) for x in s.columns]
Out[198]: 
[  Description      Book ProductID
 0    Products  Domestic       X11
 2    Products  Domestic       X13
 3    Products  Domestic       X21
 4    Services  Domestic       X23
 5    Services  Domestic       X23
 6    Services  Domestic       X25,   Description           Book ProductID
 0    Products  International       X11
 1    Products  International       X12
 3    Products  International       X21
 5    Services  International       X23
 6    Services  International       X25,   Description          Book ProductID
 4    Services  Subscription       X23
 6    Services  Subscription       X25]
章丰茂
2023-03-14

我不确定你尝试的代码是否真的有机会工作。你试过以下方法吗?

f = []
for index,row in df.iterrows():
    if "International" in row['Book']:
        f.append(row)

请注意末尾的f.append(row)

这可能不是最理想的方式。

我将尝试下面的分类,它将为您提供3个更适合分组的列(按df.groupby),这将为您提供每个类别中的产品列表。

df['International'] = df.apply(lambda r: 'International' in r['Book'])
df['Domestic'] = df.apply(lambda r: 'Domestic' in r['Book'])
df['Subscription'] = df.apply(lambda r: 'Subscription' in r['Book'])
柳项明
2023-03-14

另一种方式:

国际:

df_international = df[df['Book'].str.contains('International')].reset_index(drop=True)
df_international.loc[:, 'Book'] = 'International'
print(df_international)
#      Description           Book Product ID
#0        Products  International        X11
#1        Products  International        X12
#2        Products  International        X21
#3        Services  International        X23
#4        Services  International        X25

国内:

df_domestic = df[df['Book'].str.contains('Domestic')].reset_index(drop=True)
df_domestic.loc[:, 'Book'] = 'Domestic'
print(df_domestic)
#      Description      Book Product ID
#0        Products  Domestic        X11
#1        Products  Domestic        X13
#2        Products  Domestic        X21
#3        Services  Domestic        X23
#4        Services  Domestic        X23
#5        Services  Domestic        X25

订阅:

df_subscription = df[df['Book'].str.contains('Subscription')].reset_index(drop=True)
df_subscription.loc[:, 'Book'] = 'Subscription'
print(df_subscription)
#      Description          Book Product ID
#0        Services  Subscription        X23
#1        Services  Subscription        X25
 类似资料:
  • 问题内容: 和创建之间有什么区别?请告诉我 在String中,我们只有String对象,然后为什么要区别对待这两个对象。s1和s2具有不同的存储地址,而s3和s4具有相同的存储地址。为什么它基于 运算符。 问题答案: 加载定义Java字符串中代表字符串文字的对象的类时,它们将被添加到共享池中。这样可以确保String文字的所有“副本”实际上是同一对象……即使该文字出现在多个类中。这就是为什么是。

  • 创建和有什么区别?请让我知道 在String中,我们只有String对象,那么为什么它将这两个对象区别对待。s1和s2具有不同存储器地址,而s3和s4具有相同的存储器地址。为什么它基于运算符工作?

  • 目标:基于另一个数据帧中的“键”更改一个数据帧中的NAs列(类似于VLookUp,但仅在R中除外) 这里给定df1(为了简单起见,我只有6行。我拥有的键是50个状态的50行): 这里给出了df2(这只是一个示例。我正在处理的真实数据帧有更多的行): 任务:创建一个R函数,该函数循环并读取每个df2$Article行中的状态;然后将其与df1$State\u Name交叉引用,根据df2$Artic

  • 基本上,它应该在步骤中找到指标为43且步骤=1的行,然后将该值放在新列中,在这种情况下,它将是“Gross value Added”。任何帮助都将非常感谢!

  • 我需要从不同的字典中创建一个熊猫数据框架,其中键必须作为数据框架内的列名。如果数据帧没有将键列为列,则必须动态创建键,并将其作为新列附加到数据帧。 我希望输入为, 输出应该是,, 循环的第一次迭代将键作为数据框的列名称,如果没有数据框,则创建值作为第一行的数据框。 第二次迭代检查键是否作为列出现在数据帧中,如果已经出现则插入,否则创建列并插入值作为第二行。 我确实不知道如何在python中动态运行

  • 我读过很多关于创建字符串时内存分配的相互矛盾的文章。一些文章说new operator在堆中创建一个字符串,String literal在String Pool[heap]中创建,而一些文章说new operator在堆中创建一个对象,在String Pool中创建另一个对象。 为了分析这一点,我写了下面的程序,打印字符串字符数组和字符串对象的hashcode: 此程序打印以下输出: 从这个输出中