追加带有行总和的列并在 python 中排序
Appending a Column with sum of rows and sorting in python
这是一个非常基本的问题。我想以某种方式组织一个 csv。到目前为止,我几乎已经拥有了它,而且速度也非常快。
import numpy as np
import pandas as pd
import pandas.util.testing as tm; tm.N = 3
data = pd.DataFrame.from_csv('MYDATA.csv')
byqualityissue = data.groupby(["Name","Type"]).size()
df = pd.DataFrame(bytype)
formatted = df.unstack(level=-1)
formatted[np.isnan(formatted)] = 0
formatted.to_csv('bytype.csv', header=True)
按类型看起来像这样:
Type Type1 Type2 Type3
Name
Company 1 10 0 3
Company 2 4 23 3
Company 3 3 2 0
但是,我希望对其进行排序,以便总计(行的总和)最大的公司位于顶部。在这种情况下,顶部应该是公司 2,然后是公司 1,然后是公司 3。我的 python 代码的其余部分应该 select 只读入前 20 个客户。
Name, Type1, Type2, Type3
Company 2, 4, 23, 3
Company 1, 10, 0, 3
Company 3, 3, 2, 0
我认为最好的方法是将另一列中的总数相加,然后按降序排序。为此,我写了这一行:
sorted = np.sum(formatted, axis=1)
成功输出总数。我看了How to add a new column to a CSV file using Python?
所以写道:
with open('bytype.csv') as csvinput:
with open('bytype2.csv','w') as csvoutput:
writer = csv.writer(csvoutput, lineterminator='\n')
reader = csv.reader(csvinput)
all = []
row = next(reader)
row.append('Total')
all.append(row)
for row in reader:
row.append(np.sum(formatted, axis=1))
all.append(row)
writer.writerows(all)
但我不仅没有得到 type2 的输出,而且该方法似乎意味着重新读取 csv,然后附加该列,然后我仍然需要对它们进行排序。必须有一种我所缺少的更简单的方法来做到这一点。
改天修修补补后回答了我自己的问题。这是我添加一列总计,然后按该列排序的方法。
includingtotals = pd.concat([formatted,pd.DataFrame(formatted.sum(axis=1),columns=['Total'])],axis=1)
sorted = includingtotals.sort_index(by=['Total'], ascending=[False])
sorted.to_csv('byqualityissue.csv', header=True)
这是一个非常基本的问题。我想以某种方式组织一个 csv。到目前为止,我几乎已经拥有了它,而且速度也非常快。
import numpy as np
import pandas as pd
import pandas.util.testing as tm; tm.N = 3
data = pd.DataFrame.from_csv('MYDATA.csv')
byqualityissue = data.groupby(["Name","Type"]).size()
df = pd.DataFrame(bytype)
formatted = df.unstack(level=-1)
formatted[np.isnan(formatted)] = 0
formatted.to_csv('bytype.csv', header=True)
按类型看起来像这样:
Type Type1 Type2 Type3
Name
Company 1 10 0 3
Company 2 4 23 3
Company 3 3 2 0
但是,我希望对其进行排序,以便总计(行的总和)最大的公司位于顶部。在这种情况下,顶部应该是公司 2,然后是公司 1,然后是公司 3。我的 python 代码的其余部分应该 select 只读入前 20 个客户。
Name, Type1, Type2, Type3
Company 2, 4, 23, 3
Company 1, 10, 0, 3
Company 3, 3, 2, 0
我认为最好的方法是将另一列中的总数相加,然后按降序排序。为此,我写了这一行:
sorted = np.sum(formatted, axis=1)
成功输出总数。我看了How to add a new column to a CSV file using Python?
所以写道:
with open('bytype.csv') as csvinput:
with open('bytype2.csv','w') as csvoutput:
writer = csv.writer(csvoutput, lineterminator='\n')
reader = csv.reader(csvinput)
all = []
row = next(reader)
row.append('Total')
all.append(row)
for row in reader:
row.append(np.sum(formatted, axis=1))
all.append(row)
writer.writerows(all)
但我不仅没有得到 type2 的输出,而且该方法似乎意味着重新读取 csv,然后附加该列,然后我仍然需要对它们进行排序。必须有一种我所缺少的更简单的方法来做到这一点。
改天修修补补后回答了我自己的问题。这是我添加一列总计,然后按该列排序的方法。
includingtotals = pd.concat([formatted,pd.DataFrame(formatted.sum(axis=1),columns=['Total'])],axis=1)
sorted = includingtotals.sort_index(by=['Total'], ascending=[False])
sorted.to_csv('byqualityissue.csv', header=True)