下面是一个示例dataframe:
我需要能够获得“2023-01-01”* 编辑:(一串随机数,不是真正的Date对象)* 和“Python太棒了”,并通过函数发送(do_calculations(date, phrase)
),它将返回一个新值,然后我将通过一个函数发送“2023-01-01”和“Is the pizza”,新的返回值将被放在“Is the pizza”的位置。最后,我会得到“2023-01-01”和“披萨”,并做同样的事情。
然后,我将沿着列向下,对“2023-01-02”进行相同的操作,然后是“2023-01-03”,依此类推,直到所有单元格都被替换。
我试过以下方法:
for i, row in new_df.iterrows():
print('index: ', i)
print('row: ', row['Date'], row['Title1'], row.index)
if row['Title1']:
text = do_calculations(row['Date'], row['Title1'][0])
#print("TEXT:", text)
value = new_df.at[i, row.index[1]]
print("VALUE:", value)
new_df.at[i, row.index[2]] = text
但是不能让它工作。我想这里需要另一个for循环,并且更好地使用i
索引。
无论是生成新的 Dataframe ,还是就地更新 Dataframe ,都不重要,无论哪个更快都是优选的。
下面是生成示例 Dataframe 的代码:
import pandas as pd
import random
import datetime
# Create a list of dates
date_rng = pd.date_range(start='1/1/2023', end='1/10/2023', freq='D')
# Generate random phrases
phrases = ['Hello world', 'Python is awesome', None, 'Data science is fun', 'I love coding', 'Pandas is powerful', 'Pineapples', 'Pizza', 'Krusty', 'krab', 'Is the pizza']
# Create an empty DataFrame
df = pd.DataFrame(columns=['Date', 'title1', 'title2', 'title3'])
# Populate DataFrame with random phrases
for date in date_rng:
# Generate random phrases for each column
row = [date]
row.extend(random.sample(phrases, 3))
# Append row to DataFrame
df = df.append(pd.Series(row, index=df.columns), ignore_index=True)
# Print DataFrame
print(df)
edit:我已经澄清了传递的参数之一是一个数字字符串,而不是一个真正的日期对象,大多数答案似乎都考虑到了这一点。
3条答案
按热度按时间qzlgjiam1#
IIUC,你可以用两个循环来做以下操作
zpf6vheq2#
下面是通过使用apply逐个单元调用函数来完成您所要求的操作的方法:
示例功能:
输出:
或者,如果你的函数可以为日期和短语设置Series参数的日期,你可以在逐列的基础上使用apply:
示例功能:
输出:
请注意,在上面的第一个解决方案中,函数调用的数量(如输出df中可见的callnum的值所指示的)等于单元格的数量,而在第二个解决方案中,对于每个短语列,函数仅被调用一次(如输出中的vect_callnum的值所指示的)。
js5cn81o3#
如果您需要矢量化方法,一个可能的解决方案是: