如何将数据帧切片转换为新数据帧

Posted

技术标签:

【中文标题】如何将数据帧切片转换为新数据帧【英文标题】:How to transform a slice of dataframe into a new data frame 【发布时间】:2017-02-25 19:40:20 【问题描述】:

我是 python 新手,有时对一些操作感到困惑 我有一个名为 ro 的数据框,我还使用特定列 PN 3D 过滤了此数据框以获取特定值 921,然后我使用以下代码将结果分配到一个名为 headlamp 的新数据框中:

 headlamp = ro[ro['PN 3D']=="921"]

我的头灯也是一个数据框还是只是一个切片? 我之所以问这个问题是因为我稍后在我的脚本中收到了一些奇怪的警告和结果。

例如,我创建了一个名为word 的新列并分配给headlamp

 headlamp['word'] = ""

我收到以下警告:

 A value is trying to be set on a copy of a slice from a DataFrame

之后我使用以下脚本将结果分配给headlamp['word']

 i = 0
 for row in headlamp['Comment'].astype(list):
     headlamp['word'][i] = Counter(str(row).split())
 i+=1
 print headlamp['word']

出现了同样的警告,它影响了我的结果,因为当我使用headlamp.tail() 时,headlamp['word'] 的最后一行是空的。

有谁知道问题出在哪里以及如何解决?

我们将不胜感激任何帮助

【问题讨论】:

headlamp = ro[ro['PN 3D']=="921"].copy() 如果headlamp 是一个数据框,您应该将一个series 对象分配给一个列,而不仅仅是一个空字符串。类似headlamp['word'] = pd.Series(...) 感谢您的两位回复。我用过这个.copy(),我有同样的警告和错误@MaxU。关于您的回复@TammoHeeren,我还为word 列中的所有行分配了0 值,但是在我应用脚本后,i = 0 for row in headlamp['Comment']: headlamp['word'][i] = (Counter(str(row).split())) i+=1 print headlamp['word']i = 0 for row in headlamp['Comment']: headlamp['word'][i] = (Counter(str(row).split())) i+=1 print headlamp['word'] 我遇到了与上面描述的相同的问题,该脚本并未应用于我的数据框headlamp 中的所有行。你们现在为什么? 【参考方案1】:

使用.loc

headlamp = ro.loc[ro['PN 3D']=="921"]

至于其余的和你的cmets...我很困惑。但这是我最好的猜测

设置

import pandas as pd
from string import ascii_lowercase

chars = ascii_lowercase + ' '
probs = [0.03] * 26 + [.22]

headlamp = pd.DataFrame(np.random.choice(list(chars), (10, 100), p=probs)).sum(1).to_frame('comment')
headlamp

headlamp['word'] = headlamp.comment.str.split().apply(lambda x: pd.value_counts(x).to_dict())
headlamp

【讨论】:

谢谢@piRSquared,看来.loc 已经解决了这些警告,但我仍然面临一个问题,如果你能提供帮助,我将不胜感激。 'i = 0 for row in headlamp['Comment']: headlamp.loc[i,'word'] = (Counter(str(row).split())) i+=1 print headlamp['word']` 和我有以下错误:ValueError: Must have equal len keys and value when setting with an iterable你知道问题出在哪里吗? 让我再写一次脚本i = 0 for row in headlamp['Comment']: headlamp.loc[i,'word'] = (Counter(str(row).split())) i+=1 我正在尝试通过为我的数据框的每一行计算 Comment 列上每个单词的出现次数来在 word 列上创建一个字典 @RafaelRodriguesSantos 我试图弄清楚你的意思。希望我的编辑对您有所帮助 做得很棒,非常感谢您的支持

以上是关于如何将数据帧切片转换为新数据帧的主要内容,如果未能解决你的问题,请参考以下文章

如何从末尾到开头切片数据帧?

将值从一个数据帧切片复制到另一个:使用“IndexSlice”的多索引熊猫数据帧的切片是不是总是一致地排序?

当时间戳未被归类为索引时,如何按时间戳对数据帧进行切片?

如何避免循环遍历 pandas 中的分类变量以查看/操作数据帧切片/子集

Pandas 数据帧按索引切片

为啥 pandas 多索引数据帧切片看起来不一致?