回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我写了一个程序,读取两个.csv文件(它们不是很大,每个文件有几千行),我做了一些数据清理和争论,这是每个.csv文件的最终结构(假数据仅供说明)。在</p>
<pre><code>import pandas as pd
data = [[112233, 'Rob', 99], [445566, 'John', 88]]
managers = pd.DataFrame(data)
managers.columns = ['ManagerId', 'ManagerName', 'ShopId']
print managers
ManagerId ManagerName ShopId
0 112233 Rob 99
1 445566 John 88
data = [[99, 'Shop1'], [88, 'Shop2']]
shops = pd.DataFrame(data)
shops.columns = ['ShopId', 'ShopName']
print shops
ShopId ShopName
0 99 Shop1
1 88 Shop2
data = [[99, 2000, 3000, 4000], [88, 2500, 3500, 4500]]
sales = pd.DataFrame(data)
sales.columns = ['ShopId', 'Year2010', 'Year2011', 'Year2012']
print sales
ShopId Year2010 Year2011 Year2012
0 99 2000 3000 4000
1 88 2500 3500 4500
</code></pre>
<p>然后我使用<code>xlsxwriter</code>和<code>reportlab</code>Python包在迭代数据帧的同时创建自定义的Excel表和.pdf报表。一切看起来都很好,所有命名的包都做得很好。在</p>
<p>但我担心的是,我觉得我的代码很难维护,因为我需要在多个调用中多次访问相同的数据帧行。在</p>
<p>假设我需要得到经理的名字,他们负责的商店在2010年的销售额超过1500。我的代码充满了这种调用:</p>
^{pr2}$
<p>我认为在阅读这行代码时很难看到发生了什么。我可以创建多个中间变量,但这将添加多行代码。在</p>
<p>牺牲数据库规范化思想并将所有部分合并到单个数据帧中以获得更易于维护的代码有多常见?显然有一个单一数据帧的缺点,因为当试图合并以后可能需要的其他数据帧时,它可能会变得混乱。合并它们当然会导致数据冗余,因为同一个管理器可以分配给多个车间。在</p>
<pre><code>df = managers.merge(sales, how='left', on='ShopId').
merge(shops, how='left', on='ShopId')
print df
ManagerId ManagerName ShopId Year2010 Year2011 Year2012 ShopName
0 112233 Rob 99 2000 3000 4000 Shop1
1 445566 John 88 2500 3500 4500 Shop2
</code></pre>
<p>至少这个电话变小了:</p>
<pre><code>df[df['Year2010'] > 1500]['ManagerName'].values
>>> array(['Rob', 'John'], dtype=object)
</code></pre>
<p>也许熊猫是做这种工作的一个错误的工具?在</p>
<p>office的C开发人员对我皱眉头,告诉我使用这些类,但是接下来我会有很多方法,比如<code>get_manager_sales(managerid)</code>等等。迭代用于报告的类实例听起来也很麻烦,因为我需要实现一些排序和索引(我可以用<code>pandas</code>免费获得)。在</p>
<p>字典可以工作,但它也使修改现有数据、进行合并等变得困难。语法也没有得到更好的改善。在</p>
<pre><code>data_dict = df.to_dict('records')
[{'ManagerId': 112233L,
'ManagerName': 'Rob',
'ShopId': 99L,
'ShopName': 'Shop1',
'Year2010': 2000L,
'Year2011': 3000L,
'Year2012': 4000L},
{'ManagerId': 445566L,
'ManagerName': 'John',
'ShopId': 88L,
'ShopName': 'Shop2',
'Year2010': 2500L,
'Year2011': 3500L,
'Year2012': 4500L}]
</code></pre>
<p>获得负责2010年销售额超过1500家店铺的经理姓名。在</p>
<pre><code>[row['ManagerName'] for row in data_dict if row['Year2010'] > 1500]
>>> ['Rob', 'John']
</code></pre>
<p><strong>在这个我操作数据的特殊情况下,我应该一直使用<code>pandas</code>还是有其他方法在利用<code>pandas</code>的能力的同时编写更干净的代码?</strong></p>