Python 使用pandas在数据帧中插入行
我创建了一个静态方法,为参与实验的参与者创建了一个随机培训协议。这种方法很有效,但我希望训练日总是从“直线滑翔”开始。有没有一个简单的方法可以在熊猫身上做到这一点 我曾尝试使用.loc,但结果是它覆盖了现有的值,而这不是我想要的 谢谢 基督教徒Python 使用pandas在数据帧中插入行,python,pandas,Python,Pandas,我创建了一个静态方法,为参与实验的参与者创建了一个随机培训协议。这种方法很有效,但我希望训练日总是从“直线滑翔”开始。有没有一个简单的方法可以在熊猫身上做到这一点 我曾尝试使用.loc,但结果是它覆盖了现有的值,而这不是我想要的 谢谢 基督教徒 @staticmethod def allokeringRandom(printToCSV=False): dn = [] for i in range(1, 4): df = pd
@staticmethod
def allokeringRandom(printToCSV=False):
dn = []
for i in range(1, 4):
df = pd.DataFrame()
loype = ['STRAIGHT-GLIDING','STRAIGHT-GLIDING','LØYPE 1', 'LØYPE 1', 'LØYPE 1', 'LØYPE 2', 'LØYPE 2', 'LØYPE 2', 'LØYPE 3', 'LØYPE 3', 'LØYPE 3']
dn.append(random.sample(loype, len(loype)))
df = pd.DataFrame(dn).transpose()
df = df.rename(columns={0: "Treningsdag 1", 1: "Treningsdag 2", 2: "Treningsdag 3"})
if printToCSV == True:
df.to_csv('test3.csv')
只需在调用
df.transpose()
后覆盖数据帧的第一行即可
df.iloc[0] = ['STRAIGHT-GLIDING','STRAIGHT-GLIDING','STRAIGHT-GLIDING']
然而,我建议用一种完全不同的方式构建数据框架。从字典开始,向其中添加随机值,然后将其转换为数据帧。我发现这种实现方式更容易阅读
loype = ['STRAIGHT-GLIDING','LØYPE 1', 'LØYPE 2', 'LØYPE 3']
#start with 'STRAIGHT-GLIDING' for each training day
d = {
"Treningsdag 1":['STRAIGHT-GLIDING'],
"Treningsdag 2":['STRAIGHT-GLIDING'],
"Treningsdag 3":['STRAIGHT-GLIDING'],
}
#add random exercises
for n in range(10):
for k in d:
d[k].append(*random.sample(loype, 1))
#make a DataFrame
df = pd.DataFrame(d)
print(df)
Treningsdag 1 Treningsdag 2 Treningsdag 3
0 STRAIGHT-GLIDING STRAIGHT-GLIDING STRAIGHT-GLIDING
1 LØYPE 3 LØYPE 2 LØYPE 2
2 LØYPE 3 STRAIGHT-GLIDING LØYPE 3
3 LØYPE 2 STRAIGHT-GLIDING STRAIGHT-GLIDING
4 LØYPE 2 STRAIGHT-GLIDING LØYPE 3
5 LØYPE 3 LØYPE 3 LØYPE 3
6 LØYPE 2 LØYPE 3 LØYPE 2
7 LØYPE 3 LØYPE 3 LØYPE 3
8 LØYPE 2 STRAIGHT-GLIDING LØYPE 2
9 LØYPE 3 LØYPE 1 LØYPE 2
10 LØYPE 2 LØYPE 1 LØYPE 1
整合最新OP评论中的规范:
exercises = ['STRAIGHT-GLIDING','LØYPE 1', 'LØYPE 2', 'LØYPE 3']
max_reps = 3
training_days = ["Treningsdag 1","Treningsdag 2","Treningsdag 3"]
exercises_per_day = 12
loype = exercises * max_reps #list with all exercises, starting with 'STRAIGHT-GLIDING'
d = {}
for day in training_days:
start, end = loype[0], loype[1: exercises_per_day]
random.shuffle(end) #starts with the same exercise, shuffle the others
d[day] = [start, *end]
df = pd.DataFrame(d)
print(df)
Treningsdag 1 Treningsdag 2 Treningsdag 3
0 STRAIGHT-GLIDING STRAIGHT-GLIDING STRAIGHT-GLIDING
1 LØYPE 1 STRAIGHT-GLIDING STRAIGHT-GLIDING
2 LØYPE 3 LØYPE 3 LØYPE 1
3 STRAIGHT-GLIDING LØYPE 3 LØYPE 3
4 LØYPE 3 LØYPE 2 LØYPE 2
5 LØYPE 2 LØYPE 2 LØYPE 1
6 STRAIGHT-GLIDING LØYPE 2 LØYPE 2
7 LØYPE 2 STRAIGHT-GLIDING LØYPE 2
8 LØYPE 1 LØYPE 1 STRAIGHT-GLIDING
9 LØYPE 1 LØYPE 3 LØYPE 1
10 LØYPE 2 LØYPE 1 LØYPE 3
11 LØYPE 3 LØYPE 1 LØYPE 3
只需在调用
df.transpose()
后覆盖数据帧的第一行即可
df.iloc[0] = ['STRAIGHT-GLIDING','STRAIGHT-GLIDING','STRAIGHT-GLIDING']
然而,我建议用一种完全不同的方式构建数据框架。从字典开始,向其中添加随机值,然后将其转换为数据帧。我发现这种实现方式更容易阅读
loype = ['STRAIGHT-GLIDING','LØYPE 1', 'LØYPE 2', 'LØYPE 3']
#start with 'STRAIGHT-GLIDING' for each training day
d = {
"Treningsdag 1":['STRAIGHT-GLIDING'],
"Treningsdag 2":['STRAIGHT-GLIDING'],
"Treningsdag 3":['STRAIGHT-GLIDING'],
}
#add random exercises
for n in range(10):
for k in d:
d[k].append(*random.sample(loype, 1))
#make a DataFrame
df = pd.DataFrame(d)
print(df)
Treningsdag 1 Treningsdag 2 Treningsdag 3
0 STRAIGHT-GLIDING STRAIGHT-GLIDING STRAIGHT-GLIDING
1 LØYPE 3 LØYPE 2 LØYPE 2
2 LØYPE 3 STRAIGHT-GLIDING LØYPE 3
3 LØYPE 2 STRAIGHT-GLIDING STRAIGHT-GLIDING
4 LØYPE 2 STRAIGHT-GLIDING LØYPE 3
5 LØYPE 3 LØYPE 3 LØYPE 3
6 LØYPE 2 LØYPE 3 LØYPE 2
7 LØYPE 3 LØYPE 3 LØYPE 3
8 LØYPE 2 STRAIGHT-GLIDING LØYPE 2
9 LØYPE 3 LØYPE 1 LØYPE 2
10 LØYPE 2 LØYPE 1 LØYPE 1
整合最新OP评论中的规范:
exercises = ['STRAIGHT-GLIDING','LØYPE 1', 'LØYPE 2', 'LØYPE 3']
max_reps = 3
training_days = ["Treningsdag 1","Treningsdag 2","Treningsdag 3"]
exercises_per_day = 12
loype = exercises * max_reps #list with all exercises, starting with 'STRAIGHT-GLIDING'
d = {}
for day in training_days:
start, end = loype[0], loype[1: exercises_per_day]
random.shuffle(end) #starts with the same exercise, shuffle the others
d[day] = [start, *end]
df = pd.DataFrame(d)
print(df)
Treningsdag 1 Treningsdag 2 Treningsdag 3
0 STRAIGHT-GLIDING STRAIGHT-GLIDING STRAIGHT-GLIDING
1 LØYPE 1 STRAIGHT-GLIDING STRAIGHT-GLIDING
2 LØYPE 3 LØYPE 3 LØYPE 1
3 STRAIGHT-GLIDING LØYPE 3 LØYPE 3
4 LØYPE 3 LØYPE 2 LØYPE 2
5 LØYPE 2 LØYPE 2 LØYPE 1
6 STRAIGHT-GLIDING LØYPE 2 LØYPE 2
7 LØYPE 2 STRAIGHT-GLIDING LØYPE 2
8 LØYPE 1 LØYPE 1 STRAIGHT-GLIDING
9 LØYPE 1 LØYPE 3 LØYPE 1
10 LØYPE 2 LØYPE 1 LØYPE 3
11 LØYPE 3 LØYPE 1 LØYPE 3
如果您希望在开始时添加它,那么您应该首先手动添加它
loype = ['LØYPE 1', 'LØYPE 1', 'LØYPE 1', 'LØYPE 2', 'LØYPE 2', 'LØYPE 2', 'LØYPE 3', 'LØYPE 3', 'LØYPE 3']
dn.append(['STRAIGHT-GLIDING','STRAIGHT-GLIDING'] + random.sample(loype, len(loype)))
顺便说一句:如果你想要所有的元素,但在随机顺序,那么你可以使用洗牌
loype = ['LØYPE 1', 'LØYPE 1', 'LØYPE 1', 'LØYPE 2', 'LØYPE 2', 'LØYPE 2', 'LØYPE 3', 'LØYPE 3', 'LØYPE 3']
random.shuffle(loype)
dn.append(['STRAIGHT-GLIDING','STRAIGHT-GLIDING'] + loype)
最小工作代码
import pandas as pd
import random
dn = []
loype = ['LØYPE 1', 'LØYPE 1', 'LØYPE 1', 'LØYPE 2', 'LØYPE 2', 'LØYPE 2', 'LØYPE 3', 'LØYPE 3', 'LØYPE 3']
for _ in range(3):
random.shuffle(loype)
dn.append(['STRAIGHT-GLIDING','STRAIGHT-GLIDING'] + loype)
df = pd.DataFrame(dn).transpose()
df = df.rename(columns={0: "Treningsdag 1", 1: "Treningsdag 2", 2: "Treningsdag 3"})
print(df)
结果
Treningsdag 1 Treningsdag 2 Treningsdag 3
0 STRAIGHT-GLIDING STRAIGHT-GLIDING STRAIGHT-GLIDING
1 STRAIGHT-GLIDING STRAIGHT-GLIDING STRAIGHT-GLIDING
2 LØYPE 1 LØYPE 3 LØYPE 2
3 LØYPE 2 LØYPE 1 LØYPE 1
4 LØYPE 2 LØYPE 3 LØYPE 2
5 LØYPE 1 LØYPE 2 LØYPE 3
6 LØYPE 1 LØYPE 3 LØYPE 3
7 LØYPE 3 LØYPE 1 LØYPE 1
8 LØYPE 3 LØYPE 1 LØYPE 3
9 LØYPE 3 LØYPE 2 LØYPE 2
10 LØYPE 2 LØYPE 2 LØYPE 1
如果您希望在开始时添加它,那么您应该首先手动添加它
loype = ['LØYPE 1', 'LØYPE 1', 'LØYPE 1', 'LØYPE 2', 'LØYPE 2', 'LØYPE 2', 'LØYPE 3', 'LØYPE 3', 'LØYPE 3']
dn.append(['STRAIGHT-GLIDING','STRAIGHT-GLIDING'] + random.sample(loype, len(loype)))
顺便说一句:如果你想要所有的元素,但在随机顺序,那么你可以使用洗牌
loype = ['LØYPE 1', 'LØYPE 1', 'LØYPE 1', 'LØYPE 2', 'LØYPE 2', 'LØYPE 2', 'LØYPE 3', 'LØYPE 3', 'LØYPE 3']
random.shuffle(loype)
dn.append(['STRAIGHT-GLIDING','STRAIGHT-GLIDING'] + loype)
最小工作代码
import pandas as pd
import random
dn = []
loype = ['LØYPE 1', 'LØYPE 1', 'LØYPE 1', 'LØYPE 2', 'LØYPE 2', 'LØYPE 2', 'LØYPE 3', 'LØYPE 3', 'LØYPE 3']
for _ in range(3):
random.shuffle(loype)
dn.append(['STRAIGHT-GLIDING','STRAIGHT-GLIDING'] + loype)
df = pd.DataFrame(dn).transpose()
df = df.rename(columns={0: "Treningsdag 1", 1: "Treningsdag 2", 2: "Treningsdag 3"})
print(df)
结果
Treningsdag 1 Treningsdag 2 Treningsdag 3
0 STRAIGHT-GLIDING STRAIGHT-GLIDING STRAIGHT-GLIDING
1 STRAIGHT-GLIDING STRAIGHT-GLIDING STRAIGHT-GLIDING
2 LØYPE 1 LØYPE 3 LØYPE 2
3 LØYPE 2 LØYPE 1 LØYPE 1
4 LØYPE 2 LØYPE 3 LØYPE 2
5 LØYPE 1 LØYPE 2 LØYPE 3
6 LØYPE 1 LØYPE 3 LØYPE 3
7 LØYPE 3 LØYPE 1 LØYPE 1
8 LØYPE 3 LØYPE 1 LØYPE 3
9 LØYPE 3 LØYPE 2 LØYPE 2
10 LØYPE 2 LØYPE 2 LØYPE 1
通过使用带有自定义键的
sorted
的apply()
传递序列
import random
dn = []
for i in range(1, 4):
df = pd.DataFrame()
loype = ['STRAIGHT-GLIDING','STRAIGHT-GLIDING','LØYPE 1', 'LØYPE 1', 'LØYPE 1', 'LØYPE 2', 'LØYPE 2', 'LØYPE 2', 'LØYPE 3', 'LØYPE 3', 'LØYPE 3']
dn.append(random.sample(loype, len(loype)))
df = pd.DataFrame(dn).transpose()
df = df.rename(columns={0: "Treningsdag 1", 1: "Treningsdag 2", 2: "Treningsdag 3"})
df = df.apply(lambda s: sorted(s,key=lambda x: "A" if x=="STRAIGHT-GLIDING" else x))
print(df.to_string(index=False))
输出
Treningsdag 1 Treningsdag 2 Treningsdag 3
STRAIGHT-GLIDING STRAIGHT-GLIDING STRAIGHT-GLIDING
STRAIGHT-GLIDING STRAIGHT-GLIDING STRAIGHT-GLIDING
LØYPE 1 LØYPE 1 LØYPE 1
LØYPE 1 LØYPE 1 LØYPE 1
LØYPE 1 LØYPE 1 LØYPE 1
LØYPE 2 LØYPE 2 LØYPE 2
LØYPE 2 LØYPE 2 LØYPE 2
LØYPE 2 LØYPE 2 LØYPE 2
LØYPE 3 LØYPE 3 LØYPE 3
LØYPE 3 LØYPE 3 LØYPE 3
LØYPE 3 LØYPE 3 LØYPE 3
通过使用带有自定义键的
sorted
的apply()
传递序列
import random
dn = []
for i in range(1, 4):
df = pd.DataFrame()
loype = ['STRAIGHT-GLIDING','STRAIGHT-GLIDING','LØYPE 1', 'LØYPE 1', 'LØYPE 1', 'LØYPE 2', 'LØYPE 2', 'LØYPE 2', 'LØYPE 3', 'LØYPE 3', 'LØYPE 3']
dn.append(random.sample(loype, len(loype)))
df = pd.DataFrame(dn).transpose()
df = df.rename(columns={0: "Treningsdag 1", 1: "Treningsdag 2", 2: "Treningsdag 3"})
df = df.apply(lambda s: sorted(s,key=lambda x: "A" if x=="STRAIGHT-GLIDING" else x))
print(df.to_string(index=False))
输出
Treningsdag 1 Treningsdag 2 Treningsdag 3
STRAIGHT-GLIDING STRAIGHT-GLIDING STRAIGHT-GLIDING
STRAIGHT-GLIDING STRAIGHT-GLIDING STRAIGHT-GLIDING
LØYPE 1 LØYPE 1 LØYPE 1
LØYPE 1 LØYPE 1 LØYPE 1
LØYPE 1 LØYPE 1 LØYPE 1
LØYPE 2 LØYPE 2 LØYPE 2
LØYPE 2 LØYPE 2 LØYPE 2
LØYPE 2 LØYPE 2 LØYPE 2
LØYPE 3 LØYPE 3 LØYPE 3
LØYPE 3 LØYPE 3 LØYPE 3
LØYPE 3 LØYPE 3 LØYPE 3
我不明白你想做什么。最好显示一些示例数据和您期望的结果。如果您不使用它,为什么您要在
for
-loop的内部创建数据框
?也许您应该在for
-loop-dn=['stright-GLIDING']
之前添加直接滑动
,然后它将是列表中的第一个。我不明白您想做什么。最好显示一些示例数据和您期望的结果。如果您不使用它,为什么要在for
-loop的内部创建数据框
?也许您应该在for
-loop-dn=['stright-GLIDING']
之前添加直线滑动
,然后它将是列表中的第一个。完美。更具可读性。唯一的问题是,我每门课最多只能跑3次。@ChristianMagelssen你说的3次是什么意思?最多3个?是的。因此,总共12次跑步(每门课程3次)。直线滑行算作一次滑行course@ChristianMagelssen我已相应地修改了答案。如果您需要代码中的其他注释,请告诉我。这对我来说似乎是不言自明的。你可以进一步概括training\u days
,如果你想拥有数百天的话,只需为它设置一个范围training\u days=range(1100,1)
,并使用f字符串生成字典的键d[f'Treningsdag{day}]=[start,*end]
。这取决于你,太好了。更具可读性。唯一的问题是,我每门课最多只能跑3次。@ChristianMagelssen你说的3次是什么意思?最多3个?是的。因此,总共12次跑步(每门课程3次)。直线滑行算作一次滑行course@ChristianMagelssen我已相应地修改了答案。如果您需要代码中的其他注释,请告诉我。这对我来说似乎是不言自明的。你可以进一步概括training\u days
,如果你想拥有数百天的话,只需为它设置一个范围training\u days=range(1100,1)
,并使用f字符串生成字典的键d[f'Treningsdag{day}]=[start,*end]
。那由你决定。谢谢。这真的很有用。我在shuffle方法中发现的唯一问题是它不返回任何东西;它只是更改了列表,这意味着如果我将其分配给变量,它将返回null。但是您的解决方案与示例方法配合得非常好。shuffle
chages原始列表(它在适当的位置工作)
)-但在大多数情况下,它不会产生问题。但如果您想保留原始列表,则可以执行new\u list=loype.copy()
谢谢。通过阅读代码,我意识到另一件事是可以为.append()方法提供多个对象。我认为只有使用.insert()方法才能做到这一点,这是这两种方法之间的主要区别。但在这里,您传递了两个列表,但它起作用了。首先,我使用+
将两个列表合并为一个列表,然后我使用append()
将这一个列表添加到dn
——因此append()
只添加一个对象,如insert()
。append()
和insert()
之间唯一的区别是append()
始终在末尾插入。谢谢。这真的很有用。我在shuffle方法中发现的唯一问题是它不返回任何东西;它只是更改了列表,这意味着如果我将其分配给变量,它将返回null。但是您的解决方案与示例方法配合得非常好。shuffle
chages原始列表(它在适当的位置工作)
)-但在大多数情况下,它不会产生问题。但如果您想保留原始列表,则可以执行new\u list=loype.copy()
谢谢。通过阅读代码,我意识到另一件事是可以为.append()方法提供多个对象。我认为只有使用.insert()方法才能做到这一点,这是这两种方法之间的主要区别。但在这里,您传递了两个列表,但它起作用了。首先,我使用+
将两个列表合并到一个列表中,然后