![](/img/trans.png)
[英]Python Pandas - add column on a specific row, add specific row from one dataframe to another
[英]Obtaining specific column and row data from a dataframe in pandas in Python
我正在使用 python 中的 panadas 处理数据框。 我已经对表格进行了排序并创建了一些额外的列: https ://i.stack.imgur.com/Y6lkN.png
{'Part Number': ['K4SD',
'K4SD',
'K4SD',
'K4SD',
'K4SD',
'K4SD',
'K4SD',
'K4SD',
'K4SD',
'K4SD',
'QOL2',
'QOL2',
'QOL2',
'QOL2',
'QOL2',
'QOL2',
'QOL2',
'QOL2',
'QOL2',
'QOL2'],
'Date': [Timestamp('2021-05-17 00:00:00'),
Timestamp('2021-05-23 00:00:00'),
Timestamp('2021-07-08 00:00:00'),
Timestamp('2021-08-17 00:00:00'),
Timestamp('2021-08-17 00:00:00'),
Timestamp('2021-10-18 00:00:00'),
Timestamp('2021-12-18 00:00:00'),
Timestamp('2021-12-20 00:00:00'),
Timestamp('2022-02-10 00:00:00'),
Timestamp('2022-03-31 00:00:00'),
Timestamp('2021-10-04 00:00:00'),
Timestamp('2021-10-18 00:00:00'),
Timestamp('2021-11-03 00:00:00'),
Timestamp('2021-11-03 00:00:00'),
Timestamp('2021-11-17 00:00:00'),
Timestamp('2021-11-24 00:00:00'),
Timestamp('2021-11-27 00:00:00'),
Timestamp('2021-12-22 00:00:00'),
Timestamp('2021-12-24 00:00:00'),
Timestamp('2022-03-21 00:00:00')],
'Code': ['SF22',
'KFS3',
'3FFS',
'Replacement needed',
'LA52',
'K2KA',
'Belt Broke',
'QET6',
'QET6',
'P0SF',
'Testing Broken',
'DP2L',
'SR2F',
'JKO2',
'DP2L',
'A2BF',
'KLL2',
'Light Off',
'A3SA',
'LA52'],
'Fix': ['na',
'na',
'na',
'Custom Status',
'na',
'na',
'Remade',
'na',
'na',
'na',
'Testing Procedure Fixed',
'na',
'na',
'na',
'na',
'na',
'na',
'Light Repair',
'na',
'na'],
'Fixed': ['No',
'No',
'No',
'Yes',
'No',
'No',
'Yes',
'No',
'No',
'No',
'Yes',
'No',
'No',
'No',
'No',
'No',
'No',
'Yes',
'No',
'No'],
'Combined': ['SF22',
'KFS3',
'3FFS',
'Replacement needed',
'LA52',
'K2KA',
'Belt Broke',
'QET6',
'QET6',
'P0SF',
'Testing Broken',
'DP2L',
'SR2F',
'JKO2',
'DP2L',
'A2BF',
'KLL2',
'Light Off',
'A3SA',
'LA52']}
我按日期对数据框进行了排序,现在我想创建一个循环,该循环按行顺序排列在表中。 在循环中,如果“固定”列中的行是“否”,我想将“代码”列中该行中的值附加到一个列表(我称之为 list_test)。 然后,当“固定”列中的行变为“是”时,我想创建一个新的列表变量,它是 list_test 的副本。
然后,我想将 list_test 清除为一个空列表,以便它可以在列中重复该过程(每次有“修复”时都会自行清除)。
在上面的示例表中,我希望输出类似于以下内容:
这是我尝试解决问题的一种方法:
list_test = []
var_test = {}
for index in df.index:
var_test[index] = "Fixed_Before_" + str(index)
if df['Fixed'][index] == 'No':
list_test.append(df['Code'])
if df['Fixed'][index] == 'Yes':
var_test[index] = list_test
list_test = []
list_test
虽然,当我运行代码时,输出( https://i.stack.imgur.com/RM0Pj.png )是一个非常大的列,看起来它包含我列中的所有内容不止几次,而不是我在上面包含的输出。 我认为我的问题可能与:
确切的预期输出尚不清楚,但这里有一个建议:
mask = df['Fixed'].eq('Yes')
out = (df
.assign(index=pd.Series(df.index.where(mask), index=df.index).bfill())
.loc[~mask]
.groupby(['Part Number', mask.shift(fill_value=True).cumsum()])
.agg(fix_before=('index', 'first'),
list=('Code', list))
.reset_index(drop=True)
)
输出:
fix_before list
0 3.0 [SF22, KFS3, 3FFS]
1 6.0 [LA52, K2KA]
2 10.0 [QET6, QET6, P0SF]
3 17.0 [DP2L, SR2F, JKO2, DP2L, A2BF, KLL2]
4 NaN [A3SA, LA52]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.