【问题标题】:Count the frequency of characters at a position in a string in a Pandas DataFrame column计算 Pandas DataFrame 列中字符串中某个位置的字符频率
【发布时间】:2020-01-04 06:50:19
【问题描述】:

我有一个与df['columnA'].value_counts() 方法相关的问题和之前的帖子:Count frequency of values in pandas DataFrame column

以这个DataFrame为例:

fake_data = {'columnA': ['XAVY', 'XAVY', 'XAVY', 'XAVY', 'XAVY', 'AXYV', 'AXYV', 'AXYV', 'AXYV', 'AXYV', 'AXYV']}
df = pd.DataFrame(fake_data, columns = ['columnA'])
df

我正在尝试确定每个字母 (X,A,V,Y) 在此列中字符串中每个位置的频率。

在此示例中,位置 0 将是 54% A、46% X,位置 3 将是 46% Y、54% V...等等。

【问题讨论】:

  • 位置 3 不会是 50% V 和 50%Y。只是想知道我的问题是否正确
  • 是的!将纠正错字。
  • 它是一个建议,因此是一个评论 - 编写一个方法 def countFreq(df) 它将计算 X 在系列/列中的出现 - 记录。将您的 df[columnA] 作为输入参数传递给此方法。在 countFreq(df) 中创建一个 DICT ,其中包含 dictFreq['X'] dictFreq['A'] 等键。将字母计数作为值附加到这些 dict 键。
  • 您也可以发布所需的输出,它应该是什么样子?
  • 下面的回复,尤其是来自 Akash Kumar 的回复,已经解决了问题。从他的回答中,我会补充一点,如果您希望频率处于特定位置:stats.iloc[0]

标签: python pandas


【解决方案1】:

也许这会有所帮助:

new_data = df.columnA.str.split('',n=4, expand=True).drop(0, axis=1)
stats = new_data.apply(pd.Series.value_counts)
stats = stats.apply(lambda x: (x/x.sum())*100).round(2).fillna(0)
print(stats)

输出

    1      2    3     4
A   54.54 45.45 0     0
V   0     0     45.45 54.54
X   45.45 54.54 0     0
Y   0     0     54.54 45.45

【讨论】:

  • 我相信第一行有错字:new_data = df.columnA.str.split('',n=4, expand=True).drop(0, axis=1)
【解决方案2】:

首先将字符串转换为列表,然后展开为列。然后计数值并计算每个字母的出现百分比。

(
    df.columnA.apply(list)
    .apply(pd.Series)
    .apply(pd.value_counts)
    .apply(lambda x: x.div(x.sum()))
    .fillna(0)
)

    0           1           2           3
A   0.545455    0.454545    0.000000    0.000000
V   0.000000    0.000000    0.454545    0.545455
X   0.454545    0.545455    0.000000    0.000000
Y   0.000000    0.000000    0.545455    0.454545

【讨论】:

    【解决方案3】:

    这将展开链接的帖子:

    ddf = df['columnA'].apply(lambda x : pd.Series(list(x)))
    counts = ddf[c].value_counts() / ddf[c].value_counts().sum() for c in ddf.columns]
    

    counts 是一个列表,其中包含由value_counts() 为每一列生成的系列。因此,要检查位置 0,请执行 counts[0]。它会给出:

    A    0.545455
    X    0.454545
    Name: 0, dtype: float64
    

    【讨论】:

      【解决方案4】:

      从头开始

      >>> df.columnA.str.split('', expand=True).apply(pd.Series.value_counts)
            0    1    2    3    4     5
         11.0  NaN  NaN  NaN  NaN  11.0
      A   NaN  6.0  5.0  NaN  NaN   NaN
      V   NaN  NaN  NaN  5.0  6.0   NaN
      X   NaN  5.0  6.0  NaN  NaN   NaN
      Y   NaN  NaN  NaN  6.0  5.0   NaN
      

      这样第 0 和第 5 位的列是空的,可以忽略。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-18
        • 2017-04-19
        • 1970-01-01
        • 2023-03-25
        • 1970-01-01
        • 2012-06-04
        相关资源
        最近更新 更多