有效地将系列集成到pandas数据帧中

时间:2015-06-03 14:06:19

标签: python pandas

我有一个带有索引private static int countLines(JTextArea textArea) { AttributedString text = new AttributedString(textArea.getText()); text.addAttribute(TextAttribute.FONT, textArea.getFont()); FontRenderContext frc = textArea.getFontMetrics(textArea.getFont()).getFontRenderContext(); AttributedCharacterIterator charIt = text.getIterator(); LineBreakMeasurer lineMeasurer = new LineBreakMeasurer(charIt, frc); Insets textAreaInsets = textArea.getInsets(); float formatWidth = textArea.getWidth() - textAreaInsets.left - textAreaInsets.right; lineMeasurer.setPosition(charIt.getBeginIndex()); int noLines = 0; while (lineMeasurer.getPosition() < charIt.getEndIndex()) { lineMeasurer.nextLayout(formatWidth); noLines++; } return noLines; } 的pandas数据框,还有一个类似这样的列表:[0, 1, 2...]

我想添加一个&#39;计数&#39;数据框的列,它反映了列表中引用索引中数字的次数。

鉴于上面的示例列表,&#39;计数&#39; column的索引[1, 2, 2, 0, 1...]的值为2,因为2发生了两次(到目前为止)。有没有比迭代列表更有效的方法呢?

2 个答案:

答案 0 :(得分:1)

这里有一种方法,首先将列表加载到df中,然后添加&#39;出现&#39;使用value_counts然后将merge列添加到您的orig df:

In [61]:
df = pd.DataFrame({'a':np.arange(10)})
l=[1,2,2,0,1]
df1 = pd.DataFrame(l, columns=['data'])
df1['occurence'] = df1['data'].map(df1['data'].value_counts())
df1

Out[61]:
   data  occurence
0     1          2
1     2          2
2     2          2
3     0          1
4     1          2

In [65]:
df.merge(s, left_index=True, right_on='data',how='left').fillna(0).drop_duplicates().reset_index(drop=True)

Out[65]:
   a  data  count
0  0     0      1
1  1     1      2
2  2     2      2
3  3     3      0
4  4     4      0
5  5     5      0
6  6     6      0
7  7     7      0
8  8     8      0
9  9     9      0

答案 1 :(得分:0)

在pandas中计算数据框中数字的出现很容易

您只需使用Series.value_counts方法。

然后使用pandas.merge函数将分组的数据框与原始数据框连接起来。

像你拥有的那样设置一个DataFrame:

df = pd.DataFrame({'nomnom':np.random.choice(['cookies', 'biscuits', 'cake', 'lie'], 10)})

df现在是一个包含一些任意数据的DataFrame(因为你说你有更多的数据)。

     nomnom
0  biscuits
1       lie
2  biscuits
3      cake
4       lie
5   cookies
6      cake
7      cake
8      cake
9      cake

设置一个类似你所拥有的列表:

yourlist = np.random.choice(10, 10)

你的名单现在是:

array([2, 9, 2, 3, 4, 8, 5, 8, 6, 8])

您需要的实际代码(TLDR;):

counts = pd.DataFrame(pd.value_counts(yourlist))
pd.merge(left=df, left_index=True,
         right=counts, right_index=True,
         how='left').fillna(0)