我有一个相对简单的数据框,看起来像这样(见下文)。其中一列“书”是一个字符串列表。
我的目标是为“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问题,但找不到一个在这种情况下有帮助的问题。
我用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]
我不确定你尝试的代码是否真的有机会工作。你试过以下方法吗?
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'])
另一种方式:
国际:
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: 此程序打印以下输出: 从这个输出中