<p>我终于能够用下面的代码做我需要的事情了。我主要使用一些python进行循环,但我仍然觉得必须有一种更“熊猫”的方式来实现这一点。基于其他stackoverflow问题,我尝试了几种方法,但在其他方面很难做到这一点。我将把代码留在这里,但我们非常感谢您的反馈,欢迎您提出更多想法</p>
<pre><code>vals = [['1.00.00.00', 'Total Assets', 1800], ['1.01.00.00', 'Cash', 1000], ['1.02.00.00', 'Inventory', 900], ['1.02.01.00', 'Goods in process', 300], ['1.02.02.00', 'Goods for sale', 500], ['1.02.03.00', 'Goods other', 100], ['2.00.00.00', 'Liabilities', 900], ['2.01.00.00', 'Commercial Liabilities', 850], ['2.02.00.00', 'Other liabilities', 50], ['2.03.00.00', 'More liabilities', 20], ['2.03.01.00', 'One liability', 20], ['2.03.01.01', 'One-One liability', 20], ['2.03.01.02', 'One-Two liability', 20], ['2.03.02.00', 'Two liability', 20], ['2.04.00.00', 'One More liability', 20], ['3.00.00.00', 'Net equity', 250]]
cols = ['account', 'name', 'balance']
df = pd.DataFrame(vals, columns=cols)
level_cols = ['level_1', 'level_2', 'level_3', 'level_4',]
df[level_cols] = df['account'].str.split('.',expand=True)
df['account_level'] = ""
df['imputable'] = ""
clasif_cols = ['clasif_1', 'clasif_2', 'clasif_3', 'clasif_4']
for col in clasif_cols:
df[col] = ""
for i in range(len(df)):
row = df.loc[i]
account_level = 0
if i == 0:
account_level += 1
df.loc[i, 'clasif_1'] = row['name']
else:
for level in range(4):
level_col = "level_"+str(level+1)
clasif_col = "clasif_"+str(level+1)
if row[level_col] == '00':
break
else:
account_level += 1
prev_row = df.loc[i-1]
# If row level is the same as previous value, repeat previous clasification.
# Else, assign name to this clasification
if row[level_col] == prev_row[level_col]:
df.loc[i, clasif_col] = prev_row[clasif_col]
else:
df.loc[i, clasif_col] = row['name']
df.loc[i, 'account_level'] = account_level
for i in range(len(df)):
row = df.loc[i]
# If this is the last row, it is an imputable account for sure. Also needed it to avoid an error at last row.
if i == (len(df)-1):
df.loc[i, 'imputable'] = "YES"
# else, if the level of this row is equal or higher than the level of the next row, this is an imputable account
else:
next_row = df.loc[i+1]
if row['account_level'] >= next_row['account_level']:
df.loc[i, 'imputable'] = "YES"
df.drop(level_cols, axis=1, inplace=True)
df
</code></pre>
<p>输出:</p>
<p><a href="https://i.stack.imgur.com/G8WTl.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/G8WTl.png" alt="enter image description here"/></a></p>