import pandas as pd
df = pd.DataFrame(data={"col1": [1,1,100,1,1,100], 'col2': [1,1,100,1,1,100]})
# get list of columns (will be used later)
cols = df.columns
# create list of next division by 2 (will be used later)
original = 100
ll = []
for x in range(1, 20):
ll.append(original)
original /= 2
ll = list(zip([x for x in range(1, 20)], ll))
# create dictionary of indexes and divisions
dd = {x:y for x,y in ll}
for c in df.columns:
df[f'{c}_next'] = df[c].shift(-1)
# main function get 1&100 pairs and replacing values
def compare_vals(row, cols):
counter = 1
for c in cols:
if row[f'{c}_next'] == 100 and row[c] == 1:
counter += 1
for c in cols:
if row[f'{c}_next'] == 100 and row[c] == 1:
row[f'{c}_next'] = dd[counter]
return row
df_new = df.apply(lambda row: compare_vals(row, cols), axis=1)
df_new = df_new[[x for x in df_new.columns if x not in cols]]
cols_new = {x: x.replace('_next', '') for x in df_new.columns}
df_new = df_new.rename(columns=cols_new)
df_new = df_new.shift(1)
df_new.iloc[0, :] = df.iloc[0,:]
ВЫХОД
col1 col2
0 1.0 1.0
1 1.0 1.0
2 25.0 25.0
3 1.0 1.0
4 1.0 1.0
5 25.0 25.0
Если вы пишете свою собственную модель, просто включите Qt.ItemIsUserCheckable
флаг в возвращаемом значении из метода flags ()
и убедитесь, что вы возвращаете
допустимое значение для Qt.CheckStateRole
из метода data ()
.
Если вы используете класс QStandardItemModel
, включите Qt. ItemIsUserCheckable
в тех, которые вы передаете методу setFlags ()
каждого элемента, и устанавливаете проверку
состояние для Qt.CheckStateRole
с его методом setData ()
.
В интерактивном сеансе Python введите следующее:
from PyQt4.QtGui import *
model = QStandardItemModel()
item = QStandardItem("Item")
item.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
item.setData(QVariant(Qt.Checked), Qt.CheckStateRole)
model.appendRow(item)
view = QListView()
view.setModel(model)
view.show()
В итоге я использовал метод, предоставленный Дэвидом Бодди в списке рассылки PyQt. Вот рабочий фрагмент, основанный на его коде:
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys
from random import randint
app = QApplication(sys.argv)
model = QStandardItemModel()
for n in range(10):
item = QStandardItem('Item %s' % randint(1, 100))
check = Qt.Checked if randint(0, 1) == 1 else Qt.Unchecked
item.setCheckState(check)
item.setCheckable(True)
model.appendRow(item)
view = QListView()
view.setModel(model)
view.show()
app.exec_()
Примечание: изменил вызов setData
с ролью проверки на setCheckState
и использовал setCheckable
вместо флагов.