当前位置: 首页 > 面试题库 >

在字符串的pandas数据框中查找值计数

冯奇思
2023-03-14
问题内容

我想获取一列中字符串的频率计数。一方面,这类似于将数据框折叠为仅反映列中的字符串的一组行。我能够通过循环解决此问题,但知道有更好的解决方案。

df示例:

       2017-08-09  2017-08-10
id                                                             
0             pre         pre   
2      active_1-3    active_1   
3        active_1    active_1   
4      active_3-7  active_3-7   
5        active_1    active_1

并想出去:

       2017-08-09  2017-08-10
pre             1           1
active_1        2           3
active_1-3      3           0
active_3-7      1           1

我搜索了很多论坛,但找不到合适的答案。

我假设使用pivot_table方法是正确的方法,但是无法获取正确的参数来折叠没有为输出df提供明显索引的表。

我可以通过使用value_counts()遍历每列并将每个值计数系列附加到新的数据帧中来使其工作,但是我知道有更好的解决方案。

for i in range(len(date_cols)):
    new_values = df[date_cols[i]].value_counts()
    output_df = pd.concat([output_df , new_values], axis=1)

谢谢!


问题答案:

您可以使用value countspd.Series(感谢改进乔恩)ie

ndf = df.apply(pd.Series.value_counts).fillna(0)



           2017-08-09 2017-08-10
活跃_1 2 3.0
active_1-3 1 0.0
active_3-7 1 1.0
1前1.0

时间

k = pd.concat([df]*1000)
# @cᴏʟᴅsᴘᴇᴇᴅ's method 
%%timeit
pd.get_dummies(k.T).groupby(by=lambda x: x.split('_', 1)[1], axis=1).sum().T
1 loop, best of 3: 5.68 s per loop


%%timeit
# @cᴏʟᴅsᴘᴇᴇᴅ's method 
k.stack().str.get_dummies().sum(level=1).T
10 loops, best of 3: 84.1 ms per loop

# My method 
%%timeit
k.apply(pd.Series.value_counts).fillna(0)
100 loops, best of 3: 7.57 ms per loop

# FabienP's method 
%%timeit
k.unstack().groupby(level=0).value_counts().unstack().T.fillna(0)
100 loops, best of 3: 7.35 ms per loop

#@Wen's method (fastest for now) 
pd.concat([pd.Series(collections.Counter(k[x])) for x in df.columns],axis=1)
100 loops, best of 3: 4 ms per loop


 类似资料:
  • 问题内容: 有没有比下面的示例更快的方法来找到Pandas DataFrame中最长字符串的长度? 使用IPython的进行计时大约需要10秒钟。 问题答案: DSM的建议似乎是您无需进行一些手动微优化就能获得的最佳效果: 请注意,显式使用该方法似乎并没有多大改进。如果您不熟悉IPython(这是非常方便的语法所来自的地方),我绝对建议您尝试一下,以快速测试此类内容。 更新 添加了屏幕截图:

  • 问题内容: 我有两个熊猫数据框,一个叫做“ orders”,另一个叫做“ daily_prices”。daily_prices如下: 订单如下: 两个数据帧的索引均为datetime.date。通过使用列表解析来遍历所有订单并在“ daily_prices”数据框中查找特定日期的特定报价,然后将该列表作为列添加到“订单”数据框中的“价格”列。 “订单”数据框。我想使用数组操作而不是循环执行此操作。

  • 我在我的数据上使用来创建如下数据的子集: 我现在想检查除了ID之外的每一列是否包含某些字符串。在这个例子中,我想为每个ID创建1列,其中包含一个包含“eg”和“0”的列。同样,还有一列告诉我其他列中是否有“sk”或“lk”。之后,除了ID之外的旧列可以从data.frame 对我来说,最困难的部分是使用动态数量的列,因为我的dplyr子集将根据具体情况返回不同数量的列,但我需要检查在每种情况下创建

  • 问题内容: 无论如何,有没有使用映射功能或更好的方法来替换整个数据框中的值? 我只知道如何在系列上执行映射。 我想用数字替换“ tesst”和“ set”列中的字符串,例如set = 1,test = 2 这是我的数据集的一个示例:(原始数据集非常大) 最终结果应该是 感谢您的指教, 问题答案: 那呢 正如@Jeff在评论中指出的那样,在熊猫版本<0.11.1中,手动添加到末尾以正确转换tesst

  • 问题内容: 我需要找到表中的所有行,其中特定字段的字符串在两个或多个位置重复。 可以在MySQL语句中完成吗? 编辑 我需要获取每一行,而不仅仅是计数有多少重复项。我希望能够编辑这些字段。 问题答案: 是的,尝试这样的事情:

  • 问题内容: 我正在努力看似非常简单的事情。我有一个包含非常长字符串的pandas数据框。 现在,当我尝试打印相同的字符串时,我看不到完整的字符串,而只看到了字符串的一部分。 我尝试了以下选项 使用 使用 使用 其中一个stackoverflow答案建议通过使用pandas display选项来增加列宽,但该方法也不起作用。 我也没有得到如何帮助我。 任何想法表示赞赏。看起来很简单,但无法获得! 问