考虑以下数据框:
df = pd.DataFrame(data=np.array([['a',1, 2, 3,'T'], ['a',4, 5, 6,'F'],
['b',7, 8, 9,'T'], ['b',10, 11 , 12,'T'], ['b',13, 14 , 15,'F']])
, columns=['id','A', 'B', 'C','T/F'])
id A B C T/F
0 a 1 2 3 T
1 a 4 5 6 F
2 b 7 8 9 T
3 b 10 11 12 T
4 b 13 14 15 F
我想将一个条件应用于T / F列,该列将使用T标签将每个id的行复制到具有相同id的更多列。 例如,我需要以下结果:
id A B C T/F
0 a 1 2 3 T 1 2 3 T
1 a 4 5 6 F 1 2 3 T
2 b 7 8 9 T 7 8 9 T
3 b 10 11 12 T 7 8 9 T
4 b 13 14 15 F 7 8 9 T
5 b 7 8 9 T 10 11 12 T
6 b 10 11 12 T 10 11 12 T
7 b 13 14 15 F 10 11 12 T
这是我的剧本:
n = np.array(df.groupby('id').size())
m = len(df.groupby('id'))
Cnt = 0
df4 = pd.DataFrame()
for prsnNo in range(m):
for i in range(n[prsnNo]):
v = df.iloc[Cnt: Cnt + n[prsnNo], :].groupby('id').cumcount() == i
df1 = df.iloc[Cnt: Cnt + n[prsnNo], :].where(v)
temp = df4
df4 = df.iloc[Cnt: Cnt + n[prsnNo], :].merge(df1, on="id", how="left")
df4 = pd.concat([temp, df4])
Cnt += n[prsnNo]
我不知道如何添加条件来检查循环中T / F列的值。如果我在循环中添加if条件,则会给出错误。
for prsnNo in range(m):
for i in range(n[prsnNo]):
if df[df['T/F'] =='T'] :
v = df.iloc[Cnt: Cnt + n[prsnNo], :].groupby('id').cumcount() == i
df1 = df.iloc[Cnt: Cnt + n[prsnNo], :].where(v)
temp = df4
df4 = df.iloc[Cnt: Cnt + n[prsnNo], :].merge(df1, on="id", how="left")
df4 = pd.concat([temp, df4])
Cnt += n[prsnNo]
谢谢,
答案 0 :(得分:1)
如果订单无关紧要,您可以使用var inst = $.datepicker._getInst($('#startdate').get(0));
inst.settings.onSelect = function (dt) {
// your code here
};
+ groupby
,然后使用first
和分组结果执行merge
。
df
v = df.groupby(['id', df['T/F'].eq('T').cumsum()])\
.first().reset_index(level=1, drop=True)
df = df.merge(v, left_on='id', right_index=True)
df.columns = df.columns.str.split('_').str[0]